砍伐樹木

題目描述
伐木工人約翰被公司安排去砍樹。他的任務是需要砍下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%的數據:1N101M301≤N≤10;1≤M≤30

對於70%的數據:1N1031≤N≤10^31M3041≤M≤30^4

對於100%的數據:1N1≤N≤10610^61M2×1091≤M≤2×10^9

#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; 
}//二分答案
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章