c++二分答案(Binary Search on Answer) 的经典写法
作者:野牛程序员:2025-11-10 10:27:22C++阅读 2248
c++二分答案(Binary Search on Answer) 的经典写法
题意示例:
给定一组木板长度,需锯成 不少于 K 根 等长木段,
求能够得到的 最大木段长度(整数)。
✅ 二分答案模板
#include <bits/stdc++.h>
using namespace std;
/*
问题示例:
给定 n 段木板,每段长度为 a[i]。
需切割成 >= k 段等长木段,求最大木段长度 L(整数)。
*/
/*
检查是否能切出 >= k 根长度为 mid 的木段
*/
bool check(const vector<int> &a, int n, int k, int mid){
int cnt = 0; // 当前可切数量
for(int i=0; i<n; i++){
cnt += a[i] / mid; // 每段木板能切多少段
if(cnt >= k) return true; // 提前结束
}
return false; // 不足 k 段
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);
int n, k;
cin >> n >> k;
vector<int> a(n);
int mx = 0; // 记录最大板长
for(int i=0; i<n; i++){
cin >> a[i];
if(a[i] > mx) mx = a[i];
}
int l = 1; // 能取的最小长度
int r = mx; // 最大可能长度
int ans = 0; // 记录答案
/*
二分答案:
目标:最大化能切出的木段长度
*/
while(l <= r){
int mid = (l + r) / 2; // 中间值为候选长度
if(check(a, n, k, mid)){
ans = mid; // mid 可行,记录
l = mid + 1; // 继续尝试更大长度
} else {
r = mid - 1; // mid 不可行,缩小
}
}
cout << ans << "\n"; // 输出最大可行长度
return 0;
}✅ 样例输入
4 11 802 743 457 539
✅ 样例输出
200
✅ 思路说明
二分的不是数组 index,而是 答案范围
令
mid表示木段候选长度判断是否能切出 ≥
k段能 → 尝试更大
否 → 缩小范围
最终输出 最大可行答案。
野牛程序员教少儿编程与信息学奥赛-微信|电话:15892516892

- 上一篇:c++stack + queue 模板
- 下一篇:cin.get()函数
