糖果传递

有 $n$ 个小朋友坐成一圈,每人有 $a[i]$ 个糖果。

每人只能给左右两人传递糖果。

每人每次传递一个糖果代价为 $1$。

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

输入格式

第一行输入一个正整数 $n$,表示小朋友的个数。

接下来 $n$ 行,每行一个整数 $a[i]$,表示第 $i$ 个小朋友初始得到的糖果的颗数。

输出格式

输出一个整数,表示最小代价。

数据范围

$1≤n≤1000000$,
$0≤a[i]≤2×10^9$,
数据保证一定有解。

输入样例:

1
2
3
4
5
4
1
2
5
4

输出样例:

1
4

题目解析

七夕祭 弱化版,推导公式详细看七夕祭

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <cstdio>
#include <algorithm>

const int N = 1000005;
int arr[N], sum[N];

int main() {
int n;
scanf("%d", &n);
long long res = 0;
for (int i = 1; i <= n; i++) {
scanf("%d", &arr[i]);
res += arr[i];
}

res /= n;

for (int i = 1; i <= n; i++) arr[i] -= res;
for (int i = 1; i <= n; i++) sum[i] = sum[i - 1] + arr[i];

std::sort(sum + 1, sum + 1 + n);
int mid = (1 + n) >> 1;
long long ans = 0;
for (int i = 1; i <= n; i++) {
ans += std::abs(sum[i] - sum[mid]);
}

printf("%lld\n", ans);
return 0;
}

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!