当前位置:首页C++ > 正文

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
野牛程序员教少儿编程与信息学竞赛-微信|电话:15892516892
  • c++二分答案(Binary Search on Answer) 的经典写法
  • 相关推荐

    最新推荐

    热门点击