UVA - 11300 Spreading the Wealth
题意:
有n个人,每个人都有一些钱,每个人都可以把任意的钱分给左右相邻的两个人(第一个人可以把钱分给第二个人和第 n 个人),求最少需要转移的钱数(保证这n个人的钱数和能被n整除)
题解:
https://blog.youkuaiyun.com/qingshui23/article/details/51302967
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6+10;
ll a[maxn];
int main()
{
int n;
while(~scanf("%d",&n))
{
ll sum = 0;
for(int i=1;i<=n;i++)
{
scanf("%lld",a+i);
sum += a[i];
}
ll m = sum/n;
for(int i=1;i<=n;i++)
a[i] = a[i]+a[i-1]-m;
sort(a+1,a+n+1);
ll k = a[(n+1)/2];
ll ans = 0;
for(int i=1;i<=n;i++)
ans += abs(a[i]-k);
printf("%lld\n",ans);
}
return 0;
}