原题链接:[COCI 2011/2012 #5] EKO / 砍树 - 洛谷
目录
1. 题目描述
2. 思路分析
3. 代码实现
1. 题目描述
2. 思路分析
二分答案。
根据题目中的“帮助 Mirko 找到伐木机锯片的最大的整数高度 H,使得他能得到的木材至少为 M 米。换句话说,如果再升高 1 米,他将得不到 M 米木材。” 我们可以判断出是用二分的第二个板子。
check() 函数中,我们设置一个变量sum,并初始化为0。遍历a数组,将sum不断累加max(0ll,a[i]-x),也就是累加锯下来的木材长度,最后我们判断:
1. 如果sum>=m,也就说明当前枚举的答案可以更大,我们就让l=mid(也就是往数轴右边找)。
2. 否则说明当前高度下,锯下来的木材长度不够m,那么我们为了得到总长度为m的木材,就得放低锯木片的高度,因此让r=mid-1。
3. 代码实现
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define endl '\n'
const int N = 1e6 + 10;
int n, m, a[N];
bool check(int x) {
int sum = 0;
for (int i = 1; i <= n; i++) {
sum += max(0ll, a[i] - x);
}
return sum >= m;
}
signed main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> a[i];
int l = 0, r = 4e5;
while (l < r) {
int mid = (l + r + 1) >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
cout << r << endl;
return 0;
}