问题标题: 酷町堂:5509

0
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;
  • }

1
已采纳
张恩泽
张恩泽
高级天翼
高级天翼

没看懂你的写法

我就是判断a[1]到a[n]减mid的和加起来大不大于m,小于就return false,否则return true

然后在主函数里写一个二分框架,满足条件就往右找

我要回答