BZOJ 1045: [HAOI2008] 糖果传递
题目
1045: [HAOI2008] 糖果传递
Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2036 Solved: 923
[Submit][Status]
Description
有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。
Input
小朋友个数n 下面n行 ai
Output
求使所有人获得均等糖果的最小代价。
Sample Input
4
1
2
5
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 }