洛谷P1873 砍树 题解 二分答案

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

首先,在已知砍伐高度 h 的情况下,我们可以直接求得能够得到的木材总长度。
所以,我们可以开一个函数 bool check(int h),用于判断在砍伐高度为 h 的情况下,得到的木材总长度是否 ≥ M;如果是,则返回 true ,否则,返回 false。

可以发现,随着砍伐高度的上升,得到的木材的数量肯定是减小的。所以存在一个高度 H,使得当 h ≤ H 时,check(h) 返回 true;当 h ≥ H+1 时,check(h) 返回 false。

我们可以通过以 h 为自变量,以 check(h) 的结果为应变量进行二分,得到这个答案。

实现代码如下:

#include <bits/stdc++.h>
using namespace std;
int n;
long long m, h[1000010];
bool check(int H) {
    long long sum = 0;
    for (int i = 0; i < n; i ++) {
        sum += max(0LL, h[i]-H);
    }
    return sum >= m;
}
int main() {
    cin >> n >> m;
    for (int i = 0; i < n; i ++) cin >> h[i];
    int L = 0, R = 1e9, res;
    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:36  quanjun  阅读(283)  评论(0编辑  收藏  举报