bzoj 1465: 糖果传递

来源:互联网 发布:找不到男朋友 知乎 编辑:程序博客网 时间:2024/06/04 18:38

Description

老师准备了一堆糖果, 恰好n个小朋友可以分到数目一样多的糖果. 老师要n个小朋友去拿糖果, 然后围着圆桌坐好, 第1个小朋友的左边是第n个小朋友, 其他第i个小朋友左边是第i-1个小朋友. 大家坐好后, 老师发现, 有些小朋友抢了很多的糖果, 有的小朋友只得到了一点点糖果, 甚至一颗也没有 , 设第i个小朋友有ai颗糖果. 小朋友们可以选择将一些糖果给他左边的或者右边的小朋友, 通过”糖果传递”最后使得每个小朋友得到的糖果数是一样多的, 假设一颗糖果从一个小朋友传给另一个小朋友的代价是1, 问怎样传递使得所耗的总代价最小.

Input

第一行一个正整数n,表示小朋友的个数. n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数.

Output

输出只有一个数, 表示最小代价.

Sample Input

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


0 0