[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
", ans);
39 }
40 int main() {
41   work();
42   return 0;
43 }
原文地址:https://www.cnblogs.com/NaVi-Awson/p/7718726.html