AcWing 122.糖果传递
1.问题
有n个小朋友坐成一圈,每人有a[i]个糖果。
每人只能给左右两人传递糖果。
每人每次传递一个糖果代价为1。
求使所有人获得均等糖果的最小代价。
输入格式
第一行输入一个正整数n,表示小朋友的个数。
接下来n行,每行一个整数a[i],表示第i个小朋友初始得到的糖果的颗数。
输出格式
输出一个整数,表示最小代价。
数据范围
1≤n≤1000000
数据保证一定有解。
输入样例:
4
1
2
5
4
输出样例:
4
2.解题思路
3.代码
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 1000010;
int a[N], c[N];
int n;
int main()
{
scanf("%d", &n);
for (int i = 1; i <= n; i ++)
scanf("%d", &a[i]);
LL sum = 0;
for (int i = 1; i <= n; i ++)
sum += a[i];
int avg = sum / n;
for (int i = n; i > 1; i --)
c[i] = c[i + 1] + avg - a[i];
c[1] = 0;
sort(c + 1, c + 1 + n);
int x1 = c[n / 2 + 1];
LL ans = 0;
for (int i = 1; i <= n; i ++)
ans += abs(c[i] - x1);
printf("%lld", ans);
return 0;
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。