题目:
砍伐树木
时间限制:1秒 内存限制:128M
题目描述
------------
小华被小林叫去砍树,他需要砍倒m米长的木材。现
在,小华弄到了一个奇怪的伐木机。伐木机工作过程
如下:小华设置一个高度参数h(米),伐木机升起
一个巨大的锯片到高度h,并锯掉所有的树比h高的部
分(当然,树木不高于h米的部分保持不变)。小华
就得到树木被锯下的部分。
例如,如果一行树的高度分别为20、15、10、17米,
小华把锯片升到15米的高度,切割后树木剩下的高度
将是15、15、10、15米,而小华将从第一棵树得到5
米,从第4棵树得到2米,共得到7米木材
小华非常关注生态保护,所以他不会砍掉过多的木
材。这正是他为什么要尽可能高的设定伐木机锯片的
原因。帮助小华找到伐木机锯片的最大的整数高度
h,使得他能得到的木材至少为m米。换句话说,如果
再升高1米,则他将得不到m米木材
------------
输入描述
第一行两个整数n和m,n表示树木的数量,m表示需要
的木材总长度
第二行n个整数,表示每棵树的高度,值均不超过
10^9.保证所有木材长度之和大于m,因此必然有解
输出描述
一行一个整数,表示砍树的最高高度
------------
样例:
输入
5 20
4 42 40 26 46
输出
36
提示
对于30%的数据:1<=n<=10,1<=m<=30
对于70%的数据:1<=n<=10^3,1<=m<=10^4
对于100%的数据:1<=n<=10^6,1<=m<=2*10^9
我的代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,r;
int a[10000000];
main(){
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>a[i];
r=max(r,a[i]);
}
sort(a+1,a+1+n);
int l=0;
while(l<r){
int mid=(l+r-1)/2;
int x=0;
for(int i=n;i>=1;i--){
if(a[i]>mid) x+=a[i]-mid;
else break;
}
if(x>m){
l=mid+1;
}else{
r=mid;
}
}
cout<<l;
}