快轉到主要內容

二分搜尋 (Binary Search)

本章節將深入探討二分搜尋法。除了在有序陣列中尋找數值外,二分搜尋更常被用於「對答案二分搜」的題型中,將最佳化問題轉化為判定問題。本章收錄了從基礎觀念到 Codeforces 的經典題解。

1. 二分搜的概念
#

介紹二分搜尋的核心思想:每次排除一半的可能性。說明使用的前提條件(單調性)與適用情境。

2. 二分搜的實作方式
#

詳細解析左閉右閉、左閉右開等不同區間定義的寫法,以及如何避免無窮迴圈的邊界設置。

3. 陣列中的二分搜
#

最基礎的應用。示範如何在一個已排序的陣列中,快速找到目標數值的位置。

4. STL 的內建二分搜
#

介紹 C++ <algorithm> 中的 binary_searchlower_boundupper_bound 的使用方式與差異。

5. 對答案二分搜
#

進階技巧。當答案具有單調性(例如:時間越長越能完成任務)時,可以直接對答案的數值範圍進行二分搜尋。

6. 常見錯誤與細節
#

整理二分搜尋中容易發生的錯誤,例如整數溢位 (Overflow)、無窮迴圈與邊界判斷失誤。

7. 題解:Ropes
#

經典題目。給定多條繩子,求能切割出 K 條等長繩子的最大長度。練習對浮點數答案進行二分搜。

8. 題解:Children Holiday
#

複雜度稍高的題目。多人吹氣球包含休息時間,求最短時間完成目標。練習撰寫較複雜的 check 函式。

9. 題解:Equation
#

數學題型。求解方程式 \(x^2 + \sqrt{x} = c\),示範浮點數二分搜的精度處理與實作。

10. 題解:String Game
#

字串處理題。依序刪除字元,求最晚何時字串 \(p\) 仍是 \(t\) 的子序列。結合子序列判定與二分搜。

11. 題解:Student Councils
#

分配問題。多個社團選人組成委員會,求最多能組成幾個委員會。練習推導判定邏輯與處理大數範圍。