码迷,mamicode.com
首页 > 其他好文 > 详细

BZOJ 1045: [HAOI2008] 糖果传递

时间:2014-10-31 18:56:58      阅读:176      评论:0      收藏:0      [点我收藏+]

标签:des   style   blog   http   io   color   os   ar   for   


题目


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的中位数时,总代价最小。


 

代码


bubuko.com,布布扣
 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

 


BZOJ 1045: [HAOI2008] 糖果传递

标签:des   style   blog   http   io   color   os   ar   for   

原文地址:http://www.cnblogs.com/WNJXYK/p/4065572.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!