当前位置: 首页 > 工具软件 > n.eko > 使用案例 >

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

赫连飞沉
2023-12-01

#include<iostream>
using namespace std;
long long a[1000010];
long long n, m, mid, num, r, l;

bool check(long long x) {
    num = 0;
    for (int i = 1; i <= n; i ++) {
        if (x < a[i])
            num += a[i] - x;  // 累加看下以这个高度去锯 能锯出多长
    }
    if (num < m)
        return true;
    else 
        return false;
}

int main()
{
    scanf("%lld %lld", &n, &m);
    for (int i = 1; i <= n; i ++) {
        scanf("%lld", &a[i]);
        r = max(r, a[i]);
    }
    while (l <= r) {
        mid = (l + r) >> 1;
        if (check(mid))  // 如果是真,就说明高度高了
            r = mid - 1;
        else 
            l = mid + 1;  // 说明高度矮了
    }
    cout << l-1;  // 为什么要减一呢, 可能有些人会问,这是因为最后一次多加了一次 所以就要减掉
    return 0;
}
 

 类似资料: