P1031 均分纸牌 (贪心)

题目传送门

题意:N堆纸牌求最小移动次数使每堆纸牌数相同(保证优解且只能相邻移动)

思路:根据贪心思想:显然相邻两堆纸牌最多移动一次,我们算出每堆纸牌与平均值的差值,得到(差或多的个数)所以我们从第一堆纸牌开始,如果差值a[1]不为0,说明这相邻两堆需要移动一次,第一堆的差值只能由第二堆给予,所以更新第二堆的差值a[2]+=a[1],然后第一堆完成不管,此时的第二堆可以看作为当前第一堆,一直递推下去,即可计算出结果。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n,sum=0;
	cin>>n;
	int a[n+1],ans=0;
	for(int i=1;i<=n;i++)
		cin>>a[i],sum+=a[i];;
	sum/=n;
	for(int i=1;i<=n;i++)
		a[i]-=sum;
	for(int i=1;i<=n;i++)
		if(a[i]) a[i+1]+=a[i],ans++;
	cout<<ans<<endl;
	return 0;
}