题目描述
有N棵树,第i棵树的高度为h[ i ]米 ( 1 <= h[ i ]<= 10^9), 小明想要得到至少M米的木材,他想要设定一个砍伐高度 t, 每棵树只有高于 t 的部分可以被砍伐, 小明希望这个砍伐高度 t 越大越好,问最大可能的t是多大。
输入描述
第一行两个整数N和M(1<=N<=1000000, 1<=M<=2×10^9)。 接下来一行一共有N个整数,分别表示每棵树的高度。 输入数据保证t有解。
输出描述
输出一个整数表示最大可能的t的大小。
样例输入
5 8 1 7 3 9 10
样例输出:
6
样例解释
小明想要至少得到8米木材,可以设定的最大砍伐高度是6,这样第2棵树可以砍下1米,第4棵树可以砍下3米,第5棵树可以砍下4米。
代码:
#include<bits/stdc++.h>
using namespace std;
int main() {
int N,M;
cin>>N>>M;
int h[N];
for (int i=0;i<N;++i) {
cin>>h[i];
}
int left=0;
int right=*max_element(h,h+N);
int r=0;
while(left<=right){
int mid=left+(right-left)/2;
long long sum=0;
for(int i=0;i<N;i++){
if (h[i]>mid) {
sum+=h[i]-mid;
}
}
if(sum>=M){
r=mid;
left=mid+1;
}else{
right=mid-1;
}
}
cout<<r<<endl;
return 0;
}