题目描述
有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。
输入输出格式
输入格式:小朋友个数n 下面n行 ai
输出格式:求使所有人获得均等糖果的最小代价。
输入输出样例
输入样例#1:
4
1
2
5
4
输出样例#1:
4
说明
对于100%的数据 n≤106
Solution:
本题和上篇博客一样,又是一道环形均分纸牌问题,只不过本题数据比较大,注意开$long;long$和读入优化,基本就$OK$了。
代码:
#include<bits/stdc++.h> #define il inline #define ll long long using namespace std; const int N=1e6+5; ll n,a[N],sum,s[N]; il ll gi(){ ll a=0;char x=getchar();bool f=0; while((x<'0'||x>'9')&&x!='-')x=getchar(); if(x=='-')x=getchar(),f=1; while(x>='0'&&x<='9')a=a*10+x-48,x=getchar(); return f?-a:a; } int main() { n=gi(); for(int i=1;i<=n;i++)a[i]=gi(),sum+=a[i]; sum/=n; for(int i=1;i<=n;i++)a[i]-=sum,s[i]=s[i-1]+a[i]; sort(s+1,s+n+1); sum=0; for(int i=1;i<=n;i++)sum+=abs(s[n/2+1]-s[i]); cout<<sum; return 0; }