描述
有n个小朋友坐成一圈,每人有a[i]个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。求使所有人获得均等糖果的最小代价。
输入格式
第一行一个正整数n<=1000000,表示小朋友的个数。接下来n行,每行一个整数a[i],表示第i个小朋友初始得到的糖果的颗数.
输出格式
一个整数,表示答案。
样例输入
4 1 2 5 4
样例输出
4
题解:就是一个均分纸牌问题,该问题一般先验证是否整除,然后每个都减取平均数,再得前缀和,最后推导公式累加答案。
对于不成环得均分纸牌问题,一般有公式
若是环形,则与货仓选址结合,得出公式:,其中s[k]为排序后得出得中位数
//#include<bits/stdc++.h>
#include<algorithm>
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <cstdio>
#include <vector>
#include <string>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <map>
using namespace std;
#define P(a,b,c) make_pair(a,make_pair(b,c))
#define rep(i,a,n) for (int i=a;i<=n;i++)
#define per(i,a,n) for (int i=n;i>=a;i--)
#define CLR(vis) memset(vis,0,sizeof(vis))
#define MST(vis,pos) memset(vis,pos,sizeof(vis))
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),(x).end()
#define fi first
#define se second
#define SZ(x) ((int)(x).size())
typedef pair<int,pair<int,int> >pii;
typedef long long ll;
const ll mod = 1000000007;
const int INF = 0x3f3f3f3f;
ll gcd(ll a, ll b) { return b ? gcd(b, a%b) : a; }
const int maxn = 1e6+5;
ll a[maxn],s[maxn];
int main(){
ll n, sum=0;
cin>>n;
rep(i,1,n){
cin>>a[i];
sum+=a[i];
}
s[0]=0;
rep(i,1,n){
a[i]-=sum/n;
s[i]=s[i-1]+a[i];
}
sort(s+1,s+n+1);
ll k=(n+1)/2;
sum=0;
rep(i,1,n){
sum+=abs(s[i]-s[k]);
}
cout<<sum;
return 0;
}