題目描述
伐木工人約翰被公司安排去砍樹。他的任務是需要砍下M(米)長的木材。公司給約翰配置了一個奇特的伐木機,這個伐木機工作過程如下:約翰需要設置一個高度參數H(米),伐木機會升起一個巨大的鋸片到高度H(米),並鋸掉所有樹比H(米)高的部分(當然,樹木不高於H(米)的部分保持不變)。約翰就得到樹木被鋸下的部分。
例如:如果一行樹的高度分別爲20、15、10和17米,約翰就把鋸片升到15米的高度,切割後樹木剩下的高度將是15、15、10和15米,而約翰將從第1棵樹得到5米,從第4棵樹得到2米,共得到7米木材。
約翰非常關注生態保護,所以他不會砍掉過多的木材。這正是他爲什麼要儘可能高地設定伐木機鋸片的原因。
你的任務:請你幫助約翰找到伐木機鋸片需要設置的最大整數高度H(米),使得他能得到的木材至少M米。換句話說,如果再升高1米,則他將得不到M米木材。
輸入格式
第1行2個整數N和M,N表示樹木的數量,M表示公司需要的木材總長度。
第2行N個整數,表示每棵樹的高度,高度均不超過10^9,保證所有木材長度之和大於M,因此必然有解。
輸出格式
輸出1個整數,即伐木機鋸片需要設置的最大整數高度H。
輸入輸出樣例
輸入 #1 複製
5 20
4 42 40 26 46
輸出 #1 複製
36
說明/提示
對於30%的數據:;
對於70%的數據:;;
對於100%的數據:;;
#include<bits/stdc++.h>
using namespace std;
int n,m,ans;
int a[1000006];
bool work(int k)
{
long long d=0;
for (int i=1;i<=n;i++)
if (a[i]>k) d+=a[i]-k;
if (d>=m) return true;
else return false;
}
int main(){
// freopen("cuttree.in","r",stdin);
// freopen("cuttree.out","w",stdout);
scanf("%d%d",&n,&m);
int l=1,r=0;
for (int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if (a[i]>r) r=a[i];
}
while (l<=r)
{
int mid=(l+r)/2;
if (work(mid))
ans=mid,l=mid+1;
else r=mid-1;
}
printf("%d\n",ans);
return 0;
}//二分答案