俗话说,OIer们最奇怪的两件事就是:
- 为什么这代码跑不过
- 为什么这代码过了
#include<cstdio>
#define max(a,b) ((a)>(b)?(a):(b))
#define LL long long
LL n,m,a[1000001],l,r;
inline LL calc(LL x)
{
LL sum=0;
for(register int i=0;i<n;++i)sum+=a[i]-x>0?a[i]-x:0;
return sum;
}
int main()
{
scanf("%lld%lld",&n,&m);
for(register LL i=0;i<n;++i)scanf("%lld",a+i),r=max(r,a[i]);
while(l<r)
{
LL mid=(l+r)>>1;
if(calc(mid)>=m)l=mid+1;
else r=mid;
}
printf("%lld\n",l-1);
}
我自己写的二分,但是不知道为什么left的值总是会比正解大1,写了这个-1之后就AC了...自己都想不明白