1. 程式人生 > >cogs luogu 砍樹

cogs luogu 砍樹

span for 如果 open spa || else 輸出 樹的高度

★ 輸入文件: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 砍樹