關於二分的使用技巧

2021-10-01 11:45:03 字數 743 閱讀 3134

對於二分的使用, 通過做題有了一定的認識, 以noip2015運輸計畫與noip2015跳石頭為例, 可以發現乙個較為重要的二分方式:

1.對於題一, 其要求的值為最大值最小, 其二分方式就應該為 mid = ( l + r ) >> 1, r = mid, l = mid + 1的方式, 而對於題二, 其要求為最小值最大, 其二分方式就應該為 mid = ( l + r + 1 ) >> 1, l = mid, r = mid - 1的方式.

2.對於1 中的描述, 我們可以得到乙個結論, 對於求解為較小值的話, 我們應選取

mid = ( l + r ) >> 1, r = mid, l = mid + 1的方式,

對於求解為較大值的話, 我們應選取

mid = ( l + r + 1 ) >> 1, l = mid, r = mid - 1的方式.

以上兩種方法有其優點, 但是, 也有其缺點, 就是需要根據情況判斷, 有沒有一種更優的方法不需要判斷嗎, 答案是肯定的, 列舉方式為mid = ( l + r ) >> 1, r = mid + 1, l = mid + 1, 終止條件為l > r 這麼做的話, 會丟失mid值, 但不需要分情況改變, 記錄乙個ans, 符合條件ans = mid, 輸出ans就好了

對於l == r 結束的方法, 我們不難發現, 較小值mid每次不會取到r, 較大值mid不會取到l, 我們就可以為了便於分辨, 我們可以記為 最大值最小 不取r (因為 l <= r ) , 最小值最大 不取l (因為 l <= r).

二分常用技巧

從小到大,公升序排列 lower bound s,t,num s t 1,查詢到第乙個大於或等於num的數的位址,不存在返回t upper bound s,t,num s t 1,查詢到第乙個大於num的數的位址,不存在返回t 從大到小,降序排列 lower bound s,t,num s t 1,...

二分小技巧

有一些題目,常常會用到二分,但無良的出題人總是會卡人們的二分。比方說你每次二分總要分滿log次,而且還總要分n次,這樣效率就變成了n log n 很是gg。但是思考發現我們的二分存在乙個小問題,就是說右端點總是被卡死的,如果解決這個瓶頸,便能實現不被卡。而能二分說明它一定有二分性質,也就是說我們可以...

關於二分查詢和二分搜尋

首先是二分查詢,舉個有序的整數陣列例子 二分查詢和搜尋都是針對有序陣列 public int rank int key,int n else if cmp 0 else return lo 如果查詢到,返回陣列下標mid,如果沒找到,return lo 有人會問了為什麼返回lo?當然你非要在找不到的...