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;
}

 

posted @ 2023-12-31 21:11  JMXZ  阅读(13)  评论(0)    收藏  举报