我在练习算法时遇到了这个问题。我无法解决它。我阅读了提供的题解,但它并没有解释解决方案背后的概念或想法。这是问题链接(Question)。
问题陈述---> 有N个男孩坐在圆圈里。每个男孩手上都有一些苹果。你发现总苹果数可以被N整除。所以你想平均分配所有男孩的苹果。但他们非常懒,每个人只想在一步中将一个苹果给邻居。计算使每个男孩拥有相同数量的苹果所需的最小步骤。
输入-->第一行为整数N,第二行包含N个数字,表示第i个男孩的苹果数。
输出-->使每个男孩拥有相同数量的苹果所需要的最小步骤。
这是官方实现:
我正在寻找关于上述代码/逻辑的解释。它是如何给出最少步骤的?欢迎任何其他解决方案/方法(不一定是代码),但请解释您的方法。如果有任何不清楚的地方,请访问链接或在评论部分提问。
问题陈述---> 有N个男孩坐在圆圈里。每个男孩手上都有一些苹果。你发现总苹果数可以被N整除。所以你想平均分配所有男孩的苹果。但他们非常懒,每个人只想在一步中将一个苹果给邻居。计算使每个男孩拥有相同数量的苹果所需的最小步骤。
输入-->第一行为整数N,第二行包含N个数字,表示第i个男孩的苹果数。
输出-->使每个男孩拥有相同数量的苹果所需要的最小步骤。
这是官方实现:
#include<bits/stdc++.h>
#define mod 10001
using namespace std;
typedef long long LL;
int main()
{
int n,a[10000],avg;
LL b[mod],val=0,s=0,m;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
s+=a[i];
}
avg=s/n;
b[0]=0;
for(int i = 0; i < n-1; i++){
b[i+1] = b[i]+a[i]-avg;
}
sort(b,b+n);
m = -b[n/2];
for(int i=0;i<n;i++)
{
val += abs(b[i]+m);
}
cout<<val;
return 0;
}
我正在寻找关于上述代码/逻辑的解释。它是如何给出最少步骤的?欢迎任何其他解决方案/方法(不一定是代码),但请解释您的方法。如果有任何不清楚的地方,请访问链接或在评论部分提问。