这道题很简单,就是一个二分,验证就是把每一个树砍下来的高度加在一起就行
#include<bits/stdc++.h>
using namespace std;
long long n,m;
int a[1000010];
bool judge(int x)
{
int sum=0;
for(int i=1;i<=n;i++)
{
int tmp=a[i]-x;
if(a[i]-x>=0)
{
sum+=tmp;
}
}
if(sum>=m)
{
return true;
}
else
{
return false;
}
}
int main()
{
cin>>n>>m;
int l=1,r=0 ;
for(int i=1;i<=n;i++)
{
cin>>a[i];
r=max(r,a[i]);
}
int ans=0;
while(l<=r)
{
int mid=(l+r)/2;
if(judge(mid))
{
ans=mid;
l=mid+1;
}
else
{
r=mid-1;
}
}
cout<<ans;
return 0;
}
看到这里,你就会知道不对劲了,因为上面的代码只能拿七十分,因为
十年OI一场空,不开long long见祖宗
真正的代码是这样的
#include<bits/stdc++.h>
using namespace std;
long long n,m;
long long a[1000010];
bool judge(long long x)
{
long long sum=0;
for(long long i=1;i<=n;i++)
{
long long tmp=a[i]-x;
if(a[i]-x>=0)
{
sum+=tmp;
}
}
if(sum>=m)
{
return true;
}
else
{
return false;
}
}
int main()
{
cin>>n>>m;
long long l=1,r=0 ;
for(long long i=1;i<=n;i++)
{
cin>>a[i];
r=max(r,a[i]);
}
long long ans=0;
while(l<=r)
{
long long mid=(l+r)/2;
if(judge(mid))
{
ans=mid;
l=mid+1;
}
else
{
r=mid-1;
}
}
cout<<ans;
return 0;
}
最后制作不易,,还望大家点个赞,谢谢。