有 $n$ 个小朋友坐成一圈,每人有 $a[i]$ 个糖果。
每人只能给左右两人传递糖果。
每人每次传递一个糖果代价为 $1$。
求使所有人获得均等糖果的最小代价。
输入格式
第一行输入一个正整数 $n$,表示小朋友的个数。
接下来 $n$ 行,每行一个整数 $a[i]$,表示第 $i$ 个小朋友初始得到的糖果的颗数。
输出格式
输出一个整数,表示最小代价。
数据范围
$1≤n≤1000000$,
$0≤a[i]≤2×10^9$,
数据保证一定有解。
输入样例:
输出样例:
题目解析
七夕祭 弱化版,推导公式详细看七夕祭
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; }
|