一句话总结:不断缩小解可能存在的范围。
关键字:有序、最大。
数学描述:求满足某个条件的最小的x。如果对于x'>x都满足,满足单调性,则可以用二分法解。
编程范式:如下,重要的找到match满足题意的解法。
注意事项:1、ub - lb > 1的写法,有多重实现方式,不要学的不伦不类;
2、看题意,如果lb + ub超过范围,可能要写成lb / 2 + ub / 2;
void solve()
{
int lb = -1, ub = N;
while (ub - lb > 1) {
int mid = (lb + ub) / 2;
if (match(mid)) {
ub = mid;
} else {
ub = lb;
}
}
// ub = lb + 1;
// ub or lb is resolution
}
类1:从有序数组中查找某个值
太基础了,不列了。
类2:假定一个解并判定是否可行
有N条线段,长度分别为Li。如果从他们中切割出K条长度相同的线段,则最长能有多长?
分析:条件:C(x):可以得到K条长度为x的线段;求满足C(x)的x,满足单调性;
int N, K;
double L[N];
// 当每个线