巨简单的实现方式
首先我们需要明确一点:我们无论怎么移动,最后的目标都是将每一堆纸牌都变成ave(平均值),同时每一堆只能由身边的两堆转移而来。
那么我们做这样的考虑,每一堆都由右边转移来,哪怕不够也先转移,大不了先用负数佘着帐,反正前面如果都小于ave后面必定有大于ave的(毕竟你平均值算出来肯定是满足让每一堆都能分到这么多的),到时候肯定都会补上的。
则可得解:
实现上我们直接遍历整个数组,如果第i个数不等于ave就由第i+1个数转移来
#include<bits/stdc++.h>
using namespace std;
const int N=110;
int n,ave,ans;
int nums[N];
int main()
{
cin >> n;
for(int i=1;i<=n;i++)
{
cin >> nums[i] ;
ave+=nums[i] ;
}
ave/=n;
for(int i=1;i<=n;i++)
{
if(nums[i]==ave)
{
continue;
}
else
{
ans++;
int div=ave-nums[i];
nums[i+1]-=div;
nums[i]=ave;
}
}
cout << ans << endl;
return 0;
}
自认为码风良好
妹妹马蜂真良好