一个long long 引发的惨案
因为数据范围过大,所以要用long long !!!
吐槽结束
一看题目的数据范围就知道只能用二分答案(话说题解区第一篇真。。。洛谷评测机太好了)
二分枚举高度,然后一个一个带进去算能看多少树,注意:累加木材的变量要开long long,不然。。。不然会爆
(最终得40,然后#2数据下载下来你会发现自己都无法手测,反正我是贴不进exe)
#include<iostream>
#include<algorithm>
using namespace std;
long long n,m;
long long a[1000007];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i];//读入
long long l=0,r=2e9+1,mid;
while(l+1<r)//模板
{
mid=(l+r)/2;
long long sum=0;//累加木材数
//本来只有这个要开long long,但是一气之下就全都写了long long
for(int i=1;i<=n;i++)
if(a[i]-mid>=0)sum+=(a[i]-mid);
//枚举每一棵树,注意:树木高度高于定好的高度才能砍
//所以先要判断是不是高,不能直接累加(不然就有木材是负的)
if(sum>=m)l=mid;//能砍到的木材太多了,说明高度太低
else r=mid;//木材太少了,高度要高一点
}
cout<<l<<endl;//l为答案
return 0;
}