[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 }

 

转载于:https://www.cnblogs.com/NaVi-Awson/p/7718726.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值