1432:糖果传递(均分纸牌的二阶)

提交数: 1183     通过数: 549

【题目描述】

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

【输入】

第一行一个正整数n≤1000000,表示小朋友的个数.

接下来n行,每行一个整数ai,表示第i个小朋友得到的糖果的颗数

【输出】

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

【输入样例】

4
1
2
5
4

【输出样例】

4

【思路分析】

https://www.cnblogs.com/719666a/p/10089161.html

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <algorithm>
 4 using namespace std;
 5 int main() {
 6     int n, k;
 7     static int a[1000005], c[1000005];        //数组在vs中因为局部数据有默认上限,支持不了这么大的数组,所以添加static把它从堆栈数据段挪到全局数据段
 8     long long ave = 0, ans = 0;
 9     cin >> n;
10     for (int i = 0; i < n; i++)
11     {
12         cin >> a[i];
13         ave += a[i];
14     }
15     ave = ave / n;
16     for (int i = 0; i < n; i++)
17     {
18         c[i] = a[i] - ave + c[i - 1];
19     }
20     sort(c, c + n);
21     k = (n - 1) / 2;
22     for (int i = 0; i <= k; i++)
23     {
24         ans += c[n - i - 1] - c[i];
25     }
26     cout << ans;
27     return 0;
28 }

 

posted @ 2020-08-10 16:43  zym112233  阅读(346)  评论(0)    收藏  举报