问题描述:
思路:
首先给出所有的数,我们可以计算出每个堆最后的平均值,由于移动方向最多只有左右,所以每个堆只能改变旁边的值,为了方便我们从左到右遍历,不断得通过下一数来调整当前数,使当前数等于平均值,所以每个数最多只需要调整一次数便可,所以是最优解。
Code:
#include<bits/stdc++.h>
using namespace std;
int m;
int a[110];
int main(){
cin >> m;
while(m -- ){
int n;
cin >> n;
int num = 0;
for(int i = 1;i <= n;i ++ ) cin >> a[i],num += a[i]; //计算总数
int t = num / n; //平均值
int ans = 0;
for(int i = 1;i <= n;i ++ ){
if(a[i] < t){ //低于平均值 从下一个数补满
a[i + 1] -= t - a[i];
ans ++ ;
}
else if(a[i] > t){ //高于平均值,多出的给下一个值
a[i + 1] += a[i] - t;
ans ++ ;
}
}
cout << ans;
puts("");
}
return 0;
}
代码运行截图: