標籤:最大 cst long color ace put 輸入 工作 script
1388 砍樹
http://codevs.cn/problem/1388/
題目描述 Description
伐木工人米爾科需要砍倒M米長的木材。這是一個對米爾科來說很容易的工作,因為他有一個漂亮的新伐木機,可以像野火一樣砍倒森林。不過,米爾科只被允許砍倒單行樹木。
米爾科的伐木機工作過程如下:米爾科設定一個高度參數H(米),伐木機升起一個巨大的鋸片到高度H,並鋸掉所有的樹比H高的部分(當然,樹木不高於H米的部分保持不變)。米爾科就得到樹木被鋸下的部分。
例如,如果一行樹的高度分別為20,15,10和17米,米爾科把鋸片升到15米的高度,切割後樹木剩下的高度將是15,15,10和15米,而米爾科將從第1棵樹得到5米,從第4棵樹得到2米,共得到7米木材。
米爾科非常關注生態保護,所以他不會砍掉過多的木材。這正是他為什麼要儘可能高地設定伐木機鋸片的原因。協助米爾科找到伐木機鋸片的最大的整數高度H,使得他能得到的木材至少為M米。換句話說,如果再升高1米,則他將得不到M米木材。
輸入描述 Input Description
第1行:2個整數N和M,N表示樹木的數量(1<=N<=1000000),M表示需要的木材總長度(1<=M<=2000000000)
第2行:N個整數表示每棵樹的高度,值均不超過1000000000.所有木材長度之和大於M,因此必然有解
輸出描述 Output Description
第1行:1個整數,表示砍樹的最高高度。
範例輸入 Sample Input
5 20
4 42 40 26 46
範例輸出 Sample Output
36
二分
#include<cstdio>#include<algorithm>#include<iostream>using namespace std;int n,m,a[1000001],l,r,ans,mid,maxn,minn=0x7fffffff;inline void init(int &p){ int x=0;char c=getchar(); while(c<‘0‘||c>‘9‘) c=getchar(); while(c>=‘0‘&&c<=‘9‘) {x=x*10+c-‘0‘;c=getchar();} p=x;}inline bool work(int k){ long long s=0; for(int i=1;i<=n;i++) if(a[i]>k) s+=a[i]-k; if(s>=m) return true; return false;}int main(){ init(n);init(m); for(int i=1;i<=n;i++) { init(a[i]); maxn=max(maxn,a[i]); minn=min(minn,a[i]); } l=minn;r=maxn; while(l<=r) { mid=(l+r)/2; if(work(mid)) { ans=max(ans,mid); l=mid+1; } else r=mid-1; } printf("%d",ans);}
codevs 1388 砍樹