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

猜你喜欢

转载自blog.csdn.net/sunyutian1998/article/details/82424907