0
点赞
收藏
分享

微信扫一扫

Robin Hood CodeForces - 672D

​​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;
}

 


举报

相关推荐

0 条评论