1045: [HAOI2008] 糖果传递
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 4094 Solved: 1970
[ Submit][ Status][ Discuss]
Description
有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。
Input
第一行一个正整数n<=987654321,表示小朋友的个数.接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数.
Output
求使所有人获得均等糖果的最小代价。
Sample Input
4
1
2
5
4
Sample Output
4
#include<stdio.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
#define LL long long
LL a[1000005], f[1000005];
int main(void)
{
LL n, i, ave, sum, ans;
while(scanf("%lld", &n)!=EOF)
{
ave = 0;
for(i=1;i<=n;i++)
{
scanf("%lld", &a[i]);
ave += a[i];
}
ave /= n;
ans = sum = 0;
for(i=1;i<=n;i++)
{
sum += a[i];
f[i] = sum-i*ave;
}
sort(f+1, f+n+1);
for(i=1;i<=n;i++)
ans += abs(f[i]-f[n/2+1]);
printf("%lld\n", ans);
}
return 0;
}