描述

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

发表评论

邮箱地址不会被公开。 必填项已用*标注