【題目描述】
有n個小朋友坐成一圈,每人有ai個糖果。每人只能給左右兩人傳遞糖果。每人每次傳遞一個糖果代價爲1。
【輸入】
第一行一個正整數n≤1000000,表示小朋友的個數.
接下來n行,每行一個整數ai,表示第i個小朋友得到的糖果的顆數.
【輸出】
求使所有人獲得均等糖果的最小代價。
【輸入樣例】
4 1 2 5 4
【輸出樣例】
4
我們將 a[i] 表示原來所擁有的糖 , x[i] 表示爲 i 傳遞的(正數表示得到,負數表示給出)
我們有 a[i] + x[i] +x[i-1] =ave
所以有 x[i] 的遞推公式 ,只需要求x[i] 與某個 x[k] 之差的和最小即可
貪心考慮 x[i] 的中位數
#pragma GCC optimize(2)
#include <bits/stdc++.h>
#define rush() int T;cin>>T;while(T--)
#define go(a) while(cin>>a)
#define ms(a,b) memset(a,b,sizeof a)
#define E 1e-8
#define debug(a) cout<<"*"<<a<<"*"<<endl
#define IOS ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define s first
#define e second
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> Pair;
const int inf=0x3f3f3f3f;
const int N=1e7+5;
int n,m,t;
int i,j,k;
int a[N],x[N];
int main()
{
IOS; string s;
while(cin>>n){
ll ave=0,ans=0;
for(i=1;i<=n;i++){
cin>>a[i];
ave+=a[i];
}
ave/=n;
for(i=1;i<=n;i++){
x[i]=x[i-1]-a[i]+ave;
}
sort(x+1,x+1+n);
int mid=n/2; if(n&1) mid++;
mid=x[mid];
for(i=1;i<=n;i++){
ans+=abs(mid-x[i]);
}
cout<<ans<<endl;
}
return 0;
}