0
已解决
胡靖坤
中级守护
中级守护
5549 伐树(cut)
经验值:1600 时间限制:1000毫秒
庐阳区2020年信息学竞赛试题
不许抄袭,一旦发现,直接清空经验!
题目描述 Description
李老板需要总长为M米的木材,他安排光头强去砍树。树林里有N棵树,为了保护环境,不能将一个树完全砍掉,会留出一部分, 因为这样树还可以继续生长。光头强将他的砍树装置的锯片高度设置为H米,这样可以锯掉所有的树比H高的部分。求在得到M米木材的前提下,H的最大值。
比如,一共有4棵树,高度分别为20、15、 8、17. 需要6米的木材,若将锯片的高度设置为15米,这样可以得到的木材为5+0+0+2=7米, 若锯片的高度提高1米,设置为16米, 只能得到木材的长度为4+1=5。为了得到6米的木材,锯片的高度最大只能设置为15米。
输入描述 Input Description
第一行两个整数N和M。
第二行,N个整数,表示每棵树的高度。
输出描述 Output Description
一个整数,意义如题所述。
样例输入 Sample Input
4 6 20 15 8 17
样例输出 Sample Output
15
数据范围及提示 Data Size & Hint
对于30%的数据,
树的高度不超过100米,1<=N<=100
对于50%的数据,
树的高度不超过1000米,1<=N<=1000
对于100%的数据,
树的高度不超过100000米,1<=N<=100000,1<=M<231
保证N棵树的总长度不小于M
70代码:
- #include<bits/stdc++.h>
- using namespace std;
- int main()
- {
- long long n,m,a[100001],i,j,s=0,s1=0,max1=-1;
- cin>>n>>m;
- for(i=1;i<=n;i++)
- {
- cin>>a[i];
- max1=max(a[i],max1);
- }
- if(m==1)
- {
- cout<<max1-1;
- return 0;
- }
- s=max1;
- i=max1;
- while(i>=2)
- {
- for(j=1;j<=n;j++)
- if(a[j]-i>0)
- s1=s1+(a[j]-i);
- if(s1<=m)
- s=s1;
- else
- {
- cout<<i;
- return 0;
- }
- s1=0;
- i--;
- }
- return 0;
- }