Description:
有nn个小朋友坐成一圈,每人有个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为11。求代价最小。
Solution:
设第个人传给第ii个人个,那么
xi−xi+1+ai=vxi−xi+1+ai=v
那么我们得出
xi+1=xi+ai−vxi+1=xi+ai−v
设ci=v−aici=v−ai
那么
x2=x1−c1x2=x1−c1
x3=x2−c2=x1−c1−c2x3=x2−c2=x1−c1−c2
对cici做前缀和
得出
xi=x1−si−1xi=x1−si−1
那么答案是
∑ni=1|si−1−x1|∑i=1n|si−1−x1|
自然x1x1取ss的中位数时答案最小。
#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;
}