二分一直是个短板
思想易懂 但边界处理很麻烦
using namespace std;
int main()
{
long long h[100001];
long long k,l,m,r,ans,sum;
int i,n,s;
while(scanf("%d%lld",&n,&k)!=EOF)
{
for(i=1;i<=n;i++)
{
scanf("%lld",h+i);
}
sort(h+1,h+n+1);
l=0,r=h[n];
while(l<=r)
{
m=(l+r)/2;
sum=0;
s=upper_bound(h+1,h+n+1,m)-h;
for(i=s;i<=n;i++)
{
sum+=(h[i]-m);
}
if(sum>=k)
{
ans=sum;
l=m+1;
}
else
{
r=m-1;
}
}
printf("%lld\n",ans);
}
return 0;
}