BZOJ1045: [HAOI2008] 糖果传递

来源:互联网 发布:js translate 做动画 编辑:程序博客网 时间:2024/05/20 23:35

Description

有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。

Input

第一行一个正整数nn<=1’000’000,表示小朋友的个数.
接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数.
Output

求使所有人获得均等糖果的最小代价。

Sample Input

4

1

2

5

4
Sample Output

4

题目传送门
又是神东西,一顿瞎搞
计算出糖果平均值
然后记录每个点之前一共差了多少糖果
然后根据这个值来赋予它坐标
那么线上求一点使所有点到他的距离最小
中间值

代码如下:

#include<cstdio>#include<cstring>#include<cstdlib>using namespace std;int n,a[1100000],pj,c[1100000];long long sum=0,ans=0;int cmp(const void*x1,const void*x2){    int n1=*(int*)x1;    int n2=*(int*)x2;    return n1-n2;   }int main(){    scanf("%d",&n);    for(int i=1;i<=n;i++)    {        scanf("%d",&a[i]);        sum+=a[i];    }    pj=sum/n;    for(int i=2;i<=n;i++)        c[i]=c[i-1]+a[i]-pj;    ans=0;    qsort(c+1,n,sizeof(int),cmp);    int mid=c[n/2+1];    for(int i=1;i<=n;i++)        ans+=abs(c[i]-mid);    printf("%lld\n",ans);    return 0;}

by_lmy