Description
有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。
Input
第一行一个正整数nn<=1'000'000,表示小朋友的个数.
接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数.
Output
求使所有人获得均等糖果的最小代价。
Sample Input
4
1
2
5
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 }