UVA11300 Spreading the Wealth

思路

经典的环形均分纸牌问题

从中位数分最优

所有数减去平均值之后做前缀和,然后和中位数求差的绝对值即可

stl nth_element(a+1,a+pos,a+n+1)
作用是把pos大的值放在a[pos]的位置上

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#define int long long
using namespace std;
int a[1000100];
int my_abs(int x){
    return (x>=0)?x:-x;
}
signed main(){
    int n;
    while(scanf("%lld",&n)==1){
        int ave=0,ans=0;
        for(int i=1;i<=n;i++)
            scanf("%lld",&a[i]),ave+=a[i];
        ave/=n;
        for(int i=1;i<=n;i++)
            a[i]-=ave;
        for(int i=1;i<=n;i++)
            a[i]+=a[i-1];
        nth_element(a+1,a+(n+1)/2,a+n+1);
        for(int i=1;i<=n;i++)
            ans+=my_abs(a[i]-a[(n+1)/2]);
        printf("%lld\n",ans);
    }
    return 0;
}
posted @ 2019-04-08 16:10  dreagonm  阅读(79)  评论(0编辑  收藏  举报