http://codeforces.com/problemset/problem/672/D
一共k天 每天最富的人给最穷的人一块钱 问k天后最富和最穷的人财富之差
其实这道题里最终的最大最小财富值没有太大关系 可以分别二分判断 最小值一定在平均值之下 最大值一定在平均值之上 两者在各自的范围内二分确定一下就好了
#include <bits/stdc++.h>
using namespace std;
#define ll long long
ll ary[500010];
ll k;
int n;
bool judgeI(ll lim)
{
ll res;
int i;
res=0;
for(i=1;i<=n;i++)
{
if(ary[i]<lim) res+=lim-ary[i];
}
if(res<=k) return true;
else return false;
}
bool judgeII(ll lim)
{
ll res;
int i;
res=0;
for(i=n;i>=1;i--)
{
if(ary[i]>lim) res+=ary[i]-lim;
}
if(res<=k) return true;
else return false;
}
int main()
{
ll sum,maxx,l,r,m,ans1,ans2;
int i;
scanf("%d%lld",&n,&k);
sum=0;
for(i=1;i<=n;i++)
{
scanf("%lld",&ary[i]);
sum+=ary[i];
maxx=max(maxx,ary[i]);
}
sort(ary+1,ary+n+1);
l=1,r=sum/n;
while(l<=r)
{
m=(l+r)/2;
if(judgeI(m)) l=m+1,ans1=m;
else r=m-1;
}
l=sum/n,r=maxx;
if(sum%n!=0) l++;
while(l<=r)
{
m=(l+r)/2;
if(judgeII(m)) r=m-1,ans2=m;
else l=m+1;
}
printf("%lld\n",ans2-ans1);
return 0;
}