• 洛谷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;
    }
    
  • 相关阅读:
    NCPC2016
    2016 ACM-ICPC CHINA-Final
    2016沈阳区域赛题解
    NAIPC2016部分题解
    Gym
    数论之莫比乌斯反演
    2018 多校 HDU
    LightOJ
    LightOJ
    java操作XML---XML基础知识
  • 原文地址:https://www.cnblogs.com/quanjun/p/12562261.html
Copyright © 2020-2023  润新知