题目描述
有n个小朋友坐成一圈,每人有ai个糖果。每人只能给左右两人传递糖果。每人每次传递一个糖果代价为1。
输入输出格式
输入格式:
小朋友个数n 下面n行 ai
输出格式:
求使所有人获得均等糖果的最小代价。
输入输出样例
输入样例#1:
4 1 2 5 4
输出样例#1:
4
说明
对于100%的数据 n≤106
Solution:
本题和上篇博客一样,又是一道环形均分纸牌问题,只不过本题数据比较大,注意开$long\;long$和读入优化,基本就$OK$了。
代码:
1 #include<bits/stdc++.h> 2 #define il inline 3 #define ll long long 4 using namespace std; 5 const int N=1e6+5; 6 ll n,a[N],sum,s[N]; 7 il ll gi(){ 8 ll a=0;char x=getchar();bool f=0; 9 while((x<‘0‘||x>‘9‘)&&x!=‘-‘)x=getchar(); 10 if(x==‘-‘)x=getchar(),f=1; 11 while(x>=‘0‘&&x<=‘9‘)a=a*10+x-48,x=getchar(); 12 return f?-a:a; 13 } 14 int main() 15 { 16 n=gi(); 17 for(int i=1;i<=n;i++)a[i]=gi(),sum+=a[i]; 18 sum/=n; 19 for(int i=1;i<=n;i++)a[i]-=sum,s[i]=s[i-1]+a[i]; 20 sort(s+1,s+n+1); 21 sum=0; 22 for(int i=1;i<=n;i++)sum+=abs(s[n/2+1]-s[i]); 23 cout<<sum; 24 return 0; 25 }
原文地址:https://www.cnblogs.com/five20/p/8870012.html
时间: 2024-11-08 19:36:53