做这道题目之前,先阅读以下博客,了解详情:
AcWing 122. 糖果传递 - AcWing
有 n 个小朋友坐成一圈,每人有 a[i] 个糖果。
每人只能给左右两人传递糖果。
每人每次传递一个糖果代价为 1。
求使所有人获得均等糖果的最小代价。
输入格式
第一行输入一个正整数 n,表示小朋友的个数。
接下来 n 行,每行一个整数 a[i],表示第 i 个小朋友初始得到的糖果的颗数。
输出格式
输出一个整数,表示最小代价。
数据范围
1≤n≤1000000,
0≤a[i]≤2×10^9,
数据保证一定有解。
输入样例:
4
1
2
5
4
输出样例:
4
只能说这种思路很好。
#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
int main()
{
int sum;
cin>>sum;
int bns[sum],ans[sum];
long long math=0;
for(int n=0;n<sum;n++)
{
cin>>bns[n];
math+=bns[n];
}
math/=sum;
ans[0]=0;
for(int n=1;n<sum;n++)
ans[n]=ans[n-1]+bns[n]-math;
sort(ans,ans+sum);
int mid=(sum-1)/2;
math=0;
for(int m=0;m<sum;m++)
{
math+=fabs(ans[mid]-ans[m]);
}
cout<<math<<endl;
return 0;
}