•主要用於在乙個單調的函式中查詢某值
• 連續函式的情況:
• 若當前查詢的區間是 [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 ...