[BZOJ1045][HAOI2008]糖果传递 (环形均分纸牌)
题意
有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。
思路
把|s[i]-s[k]|求和即可,s[i]是A的前缀和
s[k]为s数组的中位数时,总值最小
Code
#include<bits/stdc++.h> using namespace std; int a[1000005]; int sum[1000005]; int main() { long long n=0,t=0; scanf("%lld", &n); for (int i = 1; i <= n; i++) { scanf("%d", &a[i]); t += a[i]; } for (int i = 2; i <= n; i++) sum[i] = sum[i - 1] - a[i] + t / n; long long ans = 0; sort(sum + 1, sum + 1 + n); int mid = sum[n / 2]; for (int i = 1; i <= n; i++) { ans += abs(sum[i] - mid); } printf("%lld\n", ans); return 0; }