洛谷P2440 木材加工 题解 二分答案

题目链接:https://www.luogu.com.cn/problem/P2440

首先,我们可以编写一个 bool check(int len) 函数,该函数用于验证小段长度为 len 时,得到的小段的数量是否达到了 K 根。
可以发现:随着 len 的增加,可以砍伐的小段的数量肯定是单调非递增的(即要么不变,要么减少)。
也就是说:
存在一个 X,使得当 len ≤ X 时,check(len) 均返回 true;当 len ≥ X+1 时,check(len) 均返回 false。

于是我们可以将 len 作为自变量,将 check(len) 最为应变量来进行二分,找到这个最大的 X。

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
int n, k, a[100010];
bool check(int len)
{
    int cnt = 0;
    for (int i = 0; i < n; i ++)
    {
        cnt += a[i] / len;
        if (cnt >= k)
            return true;
    }
    return false;
}
int main()
{
    cin >> n >> k;
    for (int i = 0; i < n; i ++)
        cin >> a[i];
    int L = 1, R = 100000000, res = 0;
    while (L <= R)
    {
        int mid = (L + R) / 2;
        if (check(mid))
        {
            res = mid;
            L = mid+1;
        }
        else
            R = mid-1;
    }
    cout << res << endl;
    return 0;
}
posted @ 2020-03-24 21:32  quanjun  阅读(270)  评论(0编辑  收藏  举报