二分查詢與二分答案

2021-08-14 03:30:18 字數 908 閱讀 3264

•主要用於在乙個單調的函式中查詢某值

• 連續函式的情況:

• 若當前查詢的區間是 [l, r] ,查詢的值是 y ,函式單增

• 設 mid = (l + r) / 2 若 f(mid) < y 則 l = mid, 否則 r = mid

• 直至 r - l < eps

• 當前查詢的區間是 [l, r] ,查詢的值是 y ,函式單增

• 設 mid = (l + r) / 2 若 f(mid) = y 則 return mid

• 若 f(mid) < y 則 l = mid + 1, 否則 r = mid - 1

• 就是在答案的可能範圍(區間)內二分列舉

• 並檢查所窮舉的答案是否符合題意。

• 可以將最優性問題(直接求解相對較難)

• 轉化為可行性問題(答案是否符合題意相對容易)

• 二分答案當且僅當答案的範圍已知且具有單調性的時候才可以使用。

• 「最大值最小化」 或者 「最小值最大化」

二分答案的框架• 假設答案是單調遞增的,要求的是「最小值」

• l = 答案下限,r = 答案上限

• while (l <= r)

• mid = (l + r) >> 1;

• if check(mid) ans = mid, r = mid - 1; else l = mid + 1;

• return ans;

• 如何檢驗當前的答案是否符合題目的要求(限制條件)?

• 常見的方法:窮舉、貪心、搜尋、動態規劃、圖論、資料結構等

• 可以看到,二分答案問題很好地結合了其他演算法知識,非常受命題者歡迎

• noip 2010 以來經常出現,例如 noip 2015 d1t2 跳⽯頭

畢竟djh_oier是乙個蒟蒻,如有錯誤之處,敬請大牛指正!

二分查詢與二分答案(1)

我們在寫程式的時候,經常會遇到這樣一類問題 在乙個陣列中查詢乙個數是不是存在。比如在下圖的陣列中,查詢8是不是存在 如果不要求效率,我們最一般的查詢方法就是順序查詢,依次檢視a 0 a 1 a n 1 檢查是不是等於8。這樣對於長度為n的陣列,平均查詢長度是n 2 如果陣列是有序的,比如是遞增的,就...

二分查詢和二分答案

1.解釋 優點 查詢速度快。缺點 待查表為有序表。4.時間複雜度 o log n 5.示例 p2249查詢 include include using namespace std long long n,m,a 1000005 b 100005 l,r,mid,cnt,x intmain for i...

二分與二分答案學習

判斷left,mid,right的符號進行區間的精確。如下為遞迴二分求零點的操作 double find zero point double left,double right,double precesion double mid right left 2 if f mid 0 if f mid ...