BZOJ 1045: [HAOI2008] 糖果传递


题目


1045: [HAOI2008] 糖果传递

Time Limit: 10 Sec  Memory Limit: 162 MB
Submit: 2036  Solved: 923
[Submit][Status]

Description

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

Input

小朋友个数n 下面n行 ai

Output

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

Sample Input

4
1
2
5
4

Sample Output

4

HINT

 

数据规模

30% n<=1000

100% n<=100000


题解


这一道题是数学分析,设a1分给an的糖果为k,且平均数为ave。

那么总代价为W=|k|+|a1-k-ave|+|a1+a2-k-ave*2|+|a1+a2+a3-k-ave*4|……

我们记si=a1+a2+……+ai-ave*i,所以可以发现k为s1到sn的中位数时,总代价最小。


 

代码


 1 #include<cstdio>
 2 #include<algorithm>
 3 using namespace std;
 4 int a[1000001],p[1000001];
 5 long long ans,tot,now,n;
 6 
 7 int main(){
 8     scanf("%d",&n);
 9     for (int i=0;i<n;i++) scanf("%d",&a[i]),tot+=a[i];
10     tot/=n;
11     for (int i=1;i<n;i++) p[i]=p[i-1]+tot-a[i];
12     sort(p,p+n);
13     now=p[n/2];
14     for (int i=0;i<n;i++) ans+=abs(p[i]-now);
15     printf("%lld\n",ans);
16     return 0;
17 }
View Code

 


posted @ 2014-10-31 17:20  WNJXYK  阅读(160)  评论(0编辑  收藏  举报

WNJXYK-我今年一定要努力!