[HAOI 2008]糖果传递

Posted NaVi_Awson

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[HAOI 2008]糖果传递相关的知识,希望对你有一定的参考价值。

Description

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

Input

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

Output

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

Sample Input

4
1
2
5
4

Sample Output

4

题解

咳咳...[UVa 11300]Spreading the Wealth

 1 //It is made by Awson on 2017.10.23
 2 #include <set>
 3 #include <map>
 4 #include <cmath>
 5 #include <ctime>
 6 #include <cmath>
 7 #include <stack>
 8 #include <queue>
 9 #include <vector>
10 #include <string>
11 #include <cstdio>
12 #include <cstdlib>
13 #include <cstring>
14 #include <iostream>
15 #include <algorithm>
16 #define LL long long
17 #define Min(a, b) ((a) < (b) ? (a) : (b))
18 #define Max(a, b) ((a) > (b) ? (a) : (b))
19 #define sqr(x) ((x)*(x))
20 #define Abs(a) ((a) < 0 ? (-(a)) : (a)) 
21 using namespace std;
22 const int N = 1000000;
23 
24 LL n, a[N+5], m;
25 
26 void work() {
27   scanf("%lld", &n);
28   for (int i = 1; i <= n; i++) {
29     scanf("%lld", &a[i]); m += a[i];
30   }
31   m /= n;
32   for (int i = 1; i <= n; i++) {
33     a[i] = a[i-1]+a[i]-m;
34   }
35   sort(a+1, a+n+1);
36   LL mid = a[n>>1], ans = 0;
37   for (int i = 1; i <= n; i++) ans += Abs(mid-a[i]);
38   printf("%lld\\n", ans);
39 }
40 int main() {
41   work();
42   return 0;
43 }

 

以上是关于[HAOI 2008]糖果传递的主要内容,如果未能解决你的问题,请参考以下文章

bzoj 1045: [HAOI2008] 糖果传递

bzoj 1045 [HAOI2008] 糖果传递 排序

bzoj 1045 [HAOI2008] 糖果传递 —— 贪心

P2512 [HAOI2008]糖果传递

[HAOI 2008]糖果传递

1045: [HAOI2008] 糖果传递