cogs luogu 砍樹
阿新 • • 發佈:2017-06-18
span for 如果 open spa || else 輸出 樹的高度 ★ 輸入文件:
時間限制:1 s 內存限制:256 MB
eko.in
輸出文件:eko.out
簡單對比時間限制:1 s 內存限制:256 MB
【題目描述】
N棵樹,每棵都有一個整數高度。有一個木頭的總需要量M。
現在確定一個最大的統一的砍樹高度H,如果某棵樹的高度大於H,則高出的部分被砍下。使得所有被砍下的木材長度之和達到M(允許稍超過M)。
例如,有4棵樹,高度分別是20 15 10 17, 需要的木材長度為 7,砍樹高度為15時,第1棵樹被砍下5,第4棵樹被砍下2,得到的總長度為7。如果砍樹高度為16時,第1棵樹被砍下4,第4棵樹被砍下1,則得到的木材數量為5。
【輸入格式】
第1行:2個整數N和M,N表示樹木的數量(1 ≤ N ≤ 1 000 000),M表示需要的木材總長度(1 ≤ M ≤ 2 000 000 000)。
第2行: N個整數表示每棵樹的高度,值均不超過1 000 000 000。所有木材高度之和大於M,因此必然有解。
【輸出格式】
第1行:1個整數,表示砍樹的最高高度。
【樣例輸入】
5 20 4 42 40 26 46
【樣例輸出】
36
1 #include<iostream> 2 #include<cstdio> 3 4 #define ll long long 5 using namespace std; 6 const int N=1000010; 7 8 ll a[N]; 9 ll n,m; 10 11 inline ll read() 12 {13 ll x=0; 14 char c=getchar(); 15 while(c<‘0‘||c>‘9‘)c=getchar(); 16 while(c>=‘0‘&&c<=‘9‘)x=x*10+c-‘0‘,c=getchar(); 17 return x; 18 } 19 20 inline bool pd(int now) 21 { 22 ll answer=0; 23 for(int i=1;i<=n;i++) 24 if(a[i]-now>0)answer+=(a[i]-now);25 if(answer>=m)return 1; 26 else return 0; 27 } 28 29 int main() 30 { 31 freopen("eko.in","r",stdin); 32 freopen("eko.out","w",stdout); 33 n=read(); 34 m=read(); 35 ll r=-1; 36 for(int i=1;i<=n;i++) 37 { 38 a[i]=read(); 39 r=max(r,a[i]); 40 } 41 42 ll l=1; 43 ll mid; 44 while(l<r) 45 { 46 mid=(r-l)/2+l; 47 if(pd(mid))l=mid+1; 48 else r=mid; 49 } 50 printf("%lld",l-1); 51 return 0; 52 }
cogs luogu 砍樹