P2512 [HAOI2008] 糖果传递
//URL:https://www.luogu.com.cn/problem/P2512 /* 有 nn 个小朋友坐成一圈,每人有 aiai 个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为 11。 1.任两个相邻的人之间只传递一次 2.向左传递 xi 个 >0 lft pass <0 rht pass A1+x2-x1==ave A2+x3-x2==ave ... An+x1-xn==ave x2=ave+x1-A1 x3=ave+x2-A2==2ave+x1-A1-A2 x1=ave+xn-An==n*ave-A1-A2--An+x1 设C1=A1-ave C2=A1+A2-2ave Cn=A1+a2+..An-n*ave x2=x1-C1 x3=x1-C2 ... xn=x1-Cn abs(x1)+...abs(xn) 只需要找到 令中位数==Ci */ /* 4 1 2 5 4 4 */ #include<cstdio> #include<iostream> #include<algorithm> #include<cmath> #include<string.h> #include<queue> #include<vector> #include<bits/stdc++.h> typedef long long ll; #define ddd printf("-----------------------\n"); using namespace std; const int maxn=1e6 +10; const int mod=998244353; const int inf=0x3f3f3f3f; ll a[maxn],c[maxn],ave,ans; int n; int main() { ios::sync_with_stdio(false); cin>>n; for(int i=1;i<=n;i++) cin>>a[i],ave+=a[i]; ave/=n; for(int i=1;i<=n;i++) c[i]=c[i-1]+a[i]-ave; sort(c+1,c+1+n); ll mid=c[(n+1)>>1]; for(int i=1;i<=n;i++) ans+=abs(mid-c[i]); cout<<ans<<'\n'; return 0; }