Description:
有 個小朋友坐成一圈,每人有 個糖果。每人只能給左右兩人傳遞糖果。每人每次傳遞一個糖果代價爲 。求代價最小。
Solution:
設第 個人傳給第 個人 個,那麼
那麼我們得出
設
那麼
對 做前綴和
得出
那麼答案是
自然 取 的中位數時答案最小。
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e6 + 5;
int n;
ll v, ans;
ll a[maxn], s[maxn];
int read() {
int x = 0, f = 1;
char c = getchar();
while(!isdigit(c)) {
if(c == '-') {
f = -1;
}
c = getchar();
}
while(isdigit(c)) {
x = x * 10 + c - '0';
c = getchar();
}
return x * f;
}
int main() {
n = read();
for(int i = 1; i <= n; ++i) {
a[i] = read();
v += a[i];
}
v /= n;
for(int i = 2; i <= n; ++i) {
s[i] = s[i - 1] + a[i] - v;
}
sort(s + 1, s + n + 1);
ll t = s[(n + 1) / 2];
for(int i = 1; i <= n; ++i) {
ans += abs(s[i] - t);
}
printf("%lld\n", ans);
return 0;
}