P1873 [COCI 2011/2012 #5] EKO / 砍树

#include <iostream>
using namespace std;
long long n, bz, s = 0, mid, leftt, longest, trees[1000008];
int main()
{
    scanf("%lld%lld", &n, &bz);
    for (int i = 1; i <= n; i++)
    {
        scanf("%lld", &trees[i]);
        longest = max(longest, trees[i]); //找到最长木材
    }
    while (leftt <= longest)
    {
        mid = (leftt + longest) / 2; //从中间点开始作为伐木机高度
        s = 0;
        for (int i = 1; i <= n; i++)
            if (trees[i] > mid)      //树的高度大于伐木机高度
                s += trees[i] - mid; //高的部分累加
        if (s < bz)                  //木材不足
            longest = mid - 1;       //在左边搜 减小高度增加木材
        else
            leftt = mid + 1; //在右边搜 增加高度减小木材
    }
    cout << leftt - 1;
    return 0;
}

 

posted @ 2022-01-14 15:52  亚托莉的亚托莉  阅读(221)  评论(0)    收藏  举报