看到题目,想到之前写的糖果传递(环形均分纸牌问题)
其实思路简单,每堆都要达到平均值,那么我们先计算出平均值,遍历所有堆,如果当前堆不等于平均值,那么我们就索取(或者给予),这两种方式其实都是拿数值表示,没什么太大区别。这样我们就保证,每一堆只有旁边的那堆供给就可以了,不会出现A->B,然后B->C的(冗余)情况。
#include <iostream>
#include <cstring>
using namespace std;
const int N = 110;
int a[N];
int n;
int main()
{
cin >> n;
int sum = 0,res = 0;
for(int i = 0;i < n;i ++)
{
cin >> a[i];
sum += a[i];
}
int avg = sum / n;
for(int i = 0;i < n;i ++)
{
if(a[i] != avg)
{
res ++;
a[i + 1] += a[i] - avg;
}
}
cout << res << endl;
return 0;
}