1. 程式人生 > >二分查詢與二分答案

二分查詢與二分答案

二分

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

• 連續函式的情況:

• 若當前查詢的區間是 [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 跳⽯頭

例 收入計劃(http://blog.csdn.net/qq_37654726/article/details/78916798)

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