二分答案
概念讲解
什么是二分答案?
当答案具有单调性时,可以二分答案,将最优化问题转化为判定问题。
适用场景
- 最小值最大
- 最大值最小
- 第 k 大/小
整数二分
模板
1234567891011121314bool check(int mid) {
// 判断 mid 是否可行
}
int left = minVal, right = maxVal;
while (left < right) {
int mid = left + (right - left) / 2;
if (check(mid)) {
right = mid;
} else {
left = mid + 1;
}
}
// left 是最小可行解实数二分
123456789double left = 0, right = 1e9;
while (right - left > 1e-9) {
double mid = (left + right) / 2;
if (check(mid)) {
right = mid;
} else {
left = mid;
}
}考点分析
初赛考查方式
- 程序阅读: 二分答案
- 编程题: 最优化问题
常见考点
- 二分答案模板
- check 函数设计
- 单调性判断
例题精讲
例题 1:最小值最大
题目: 将数组分成 m 段,使每段和的最大值最小。
解答:
二分答案 x,check:能否将数组分成 m 段,每段和 ≤ x。
练习题
- 二分答案的条件是什么?
查看答案
二分答案的条件:
- 答案具有单调性:如果 x 可行,那么所有 ≥ x(或 ≤ x)的值都可行
- 可以设计 check 函数:能够判断某个值是否可行
常见场景:
- 最小值最大化
- 最大值最小化
- 第 k 大/小
- 如何设计 check 函数?
查看答案
check 函数的设计:
- 理解问题:明确要判断什么
- 贪心/模拟:用贪心或模拟的方法判断 mid 是否可行
- 返回结果:返回 true 或 false
例如:将数组分成 m 段,每段和 ≤ mid
- 贪心地累加,超过 mid 就分一段
- 最后看是否 ≤ m 段
- 整数二分和实数二分的区别?
查看答案
| 特性 | 整数二分 | 实数二分 |
|---|---|---|
| 范围 | 整数 | 实数 |
| 终止条件 | left < right | right - left > eps |
| 精度 | 精确 | 可控 |
| 时间复杂度 |
易错点
⚠️ 注意:
- 答案必须有单调性
- check 函数要正确
- 整数二分注意边界
- 实数二分注意精度