二分查詢與二分答案
二分
•主要用於在一個單調的函式中查詢某值
• 連續函式的情況:
• 若當前查詢的區間是 [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是一個蒟蒻,如有錯誤之處,敬請大牛指正!