Description
老师准备了一堆糖果, 恰好n个小朋友可以分到数目一样多的糖果. 老师要n个小朋友去拿糖果, 然后围着圆桌坐好, 第1个小朋友的左边是第n个小朋友, 其他第i个小朋友左边是第i-1个小朋友. 大家坐好后, 老师发现, 有些小朋友抢了很多的糖果, 有的小朋友只得到了一点点糖果, 甚至一颗也没有 , 设第i个小朋友有ai颗糖果. 小朋友们可以选择将一些糖果给他左边的或者右边的小朋友, 通过”糖果传递”最后使得每个小朋友得到的糖果数是一样多的, 假设一颗糖果从一个小朋友传给另一个小朋友的代价是1, 问怎样传递使得所耗的总代价最小.
Input
第一行一个正整数n,表示小朋友的个数. n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数.
Output
输出只有一个数, 表示最小代价.
Sample Input
4
1
2
5
4
1
2
5
4
Sample Output
4
HINT
数据范围
30%的测试数据, n<=1000.
100%的测试数据, n<=1000000.
ai>=0, 保证ai在longint/int范围内, ai的总和在int64/long long范围内.
还是不擅长做这类题目。。
http://www.cnblogs.com/zyfzyf/p/3906116.html
↑这里讲的很清楚
#include<cstdio>
#include<algorithm>
using namespace std;
long long a[1000001];
long long c[1000001];
inline long long fabs(long long x)
{
if(x<0)
x=-x;
return x;
}
int main()
{
long long n;
scanf("%lld",&n);
long long sum=0,ave;
int i;
for(i=1;i<=n;i++)
{
scanf("%lld",&a[i]);
sum+=a[i];
}
ave=sum/n;
c[0]=0;
for(i=1;i<=n-1;i++)
c[i]=c[i-1]+a[i]-ave;
sort(c,c+n);
long long mid=c[(n+1)/2];
long long ans=0;
for(i=0;i<=n-1;i++)
ans+=fabs(mid-c[i]);
printf("%lld\n",ans);
return 0;
}