1. 二分法适用范围
二分法适用在一个严格单调序列中找到给定的某个数。
2. 二分法模板提要
首先,在
1 | //二分区间位左闭右闭的[left, right],初值必须能覆盖解的所有可能取值 |
另外,如果想要寻找最后一个满足”条件C“的元素的位置,则可以先求第一个满足”条件!C“的元素的位置,然后将该位置减1即可。我们也可以把上述模板改成左开右闭的二分区间来实现。
1 | //二分区间位左开右闭的(left, right],初值必须能覆盖解的所有可能取值,并且left比最小值小1 |
3. 模板题
3.1 木棒切割问题
给出长度已知的 n 根木棒,每根木棒的长度可能不同,现在希望通过切割它们得到至少 k 段长度相等的木棒(长度必须为整数),问这些长度相等的木棒最长能有多长。
根据题意可知,长度相等的木棒的长度 L 越长,可得到的长度相等的木棒的段数越少,因此这是一个单调的情况,可以二分木棒长度 L ,当最后刚好可得到 k 段木棒时的 L 值即为所求最大长度。
1 |
|
3.2 凸多边形的最大外接圆
给出 n 个线段的长度,试将他们头尾相接(顺序任意)地组合成一个凸多边形,使得该凸多边形的外接圆(即能使凸多边形的所有顶点都在圆周上的圆)的半径最大,求该最大半径。n 不超过 $10^{5}$,线段长度均不超过100,要求算法中不涉及坐标的计算。
对于要求的半径,当半径过小时,所有线段首位相连放在圆里面形成 n 个弦,弦所对的圆心角之和大于 360°,而当半径过大时,弦所对的圆心角之和小于360°。仔细思考,圆心角之和与对应半径是一个单调的关系,因此可以采用二分法解决。
1 |
|