二分答案核心原理
严格来讲,二分答案的核心在于「二分答案 + 判定」。它专门处理那些解空间具有单调性的问题,尤其是「最大值最小」或「最小值最大」的场景。当我们在一个有序区间内寻找某个临界点,且随着数值变化,判定结果呈现明显的两段性时,就可以用二分法高效缩小范围。
1. 木材加工
这道题要求将若干根原木切割成指定数量的等长小段,求每段的最大长度。
思路分析 假设我们要切的长度为 $x$,那么每根原木能切出的段数是 $ ext{length} / x$(向下取整)。如果总段数满足需求,说明 $x$ 可能偏小,可以尝试更大的值;反之则需减小。这种单调性正是二分的基础。
代码实现
注意边界条件和整数溢出问题,这里使用 long long 存储中间结果。
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
typedef long long LL;
LL a[N], n, k;
// 计算在切割长度为 x 的情况下能切出多少段
LL calc(LL x) {
LL cnt = 0;
for (int i = 1; i <= n; i++) {
cnt += a[i] / x;
}
return cnt;
}
int main() {
cin >> n >> k;
for (int i = 1; i <= n; i++) cin >> a[i];
int l = 0, r = 1e8;
while (l < r) {
LL mid = (l + r + 1) / 2;
if (calc(mid) >= k) l = mid;
else r = mid - 1;
}
cout << l << endl;
return 0;
}


