
前言
二分答案是算法竞赛与笔试中极具技巧性的高分解法,核心思路是将复杂求解转化为简洁的二分 + 判定,专门解决「最大值最小」「最小值最大」等经典问题。本文从原理到实战,结合两道高频例题,带你从零掌握二分答案的核心逻辑与代码模板。
一、二分答案
严格来说,这属于「二分答案 + 判定」的套路。二分答案可以处理大部分「最大值最小」以及「最小值最大」的问题。如果解空间在从小到大的变化过程中,判断答案的结果出现二段性,此时我们就可以二分这个解空间,通过判定函数找出最优解。
二、二分答案经典算题
2.1 木材加工
题目描述
链接:木材加工

解题思路
这道题是典型的「最大化最小值」模型。我们需要找到一个切割长度 x,使得能切出的段数至少为 k。随着 x 增大,能切出的段数会减少;反之亦然。这种单调性保证了我们可以使用二分查找。
关键点在于确定上下界:下界通常是 1(或 0),上界可以是所有木材长度的最大值。这里为了保险起见,直接设一个足够大的数。
代码实现
// 木材加工
#include <iostream>
using namespace std;
const int N = 1e5 + 10;
typedef long long LL;
LL a[N], n, k;
// 计算在切割长度为 x 情况下切几段
LL cacl(LL x) {
if (x == 0) return 0; // 防止除以零
LL cnt = 0;
for ( i = ; i <= n; i++) cnt += a[i] / x;
cnt;
}
{
cin >> n >> k;
( i = ; i <= n; i++) cin >> a[i];
l = , r = ;
(l < r) {
LL mid = (l + r + ) / ;
((mid) >= k) l = mid;
r = mid - ;
}
cout << l << endl;
;
}



