n个人围成一圈,每人有ai支笔。每人可以向左右相邻的人传递笔,每人每次传递一支笔消耗的能量为1。求使所有人获得均等数量的笔的最小能量。
输入格式:
第一行一个整数n ,表示人的个数(30%的数据,n<=1000;100%的数据,n<=1e6)。
接下来n行,每行一个整数 ai。
输出格式:
输出一个整数,表示使所有人获得均等笔的最小能量。(答案保证可以用64位有符号整数存储)
输入样例:
4
1
2
5
4
输出样例:
4
参考:https://www.luogu.com.cn/problemnew/solution/P2512
#include<bits/stdc++.h>
using namespace std;
int main(){
long long n;cin>>n;
int a[n],x[n];
int ave=0;
long long total=0;
for(int i=0;i<n;i++){
cin>>a[i];
total+=a[i];
}
ave=(int)(total/n);
long long sum=0;
for(int i=0;i<n;i++){//x[i]给前面的人多少笔 令x[i]绝对值之和最小
x[i]=x[i-1]-a[i-1]+ave;
}
sort(x,x+n);
int mid;//找一个到其他点距离之和最小的
mid=x[n/2];//偶数时在n/2或n/2+1之间任一
for(int i=0;i<n;i++){
sum+=abs(x[i]-mid);
}
cout<<sum<<endl;
return 0;
}