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