P1031 [NOIP2002 提高组] 均分纸牌

题目传送门
这题也是很典型,因为我们要求的是他们多少步之后变为平均值,那自然算出他们各自与平均值的差。由于牌堆的牌只能放在相邻的牌堆上,所以我们不妨将每一组的数所缺(或多)的牌全部让下一个处理,保证自身变为\(0\)(即变为平均值)。

证明:如果当前牌堆的差值及时地解决,那么本来一次解决的牌堆就会浪费更多次数,由于并没有最大移动限制,所以这样最优,而且这样的移动也不会具有后效性。很像导弹拦截,但是导弹拦截要比这个高级一点,后面也会有这道题。

#include <bits/stdc++.h>
#define ll long long
#define re register
using namespace std;
const int N=100+5, INF=0x3f3f3f3f;
int n,a[N];
int t;
int sum;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		t+=a[i];
	}
	t/=n;
	for(int i=1;i<=n;i++){
		a[i]=a[i]-t;
	}
	for(int i=1;i<=n;i++){
		if(a[i]!=0){
			a[i+1]+=a[i];
			sum++;
		}
	}
	cout<<sum<<endl;
	return 0;
}

posted @ 2023-07-20 21:36  LsmQwQ  阅读(32)  评论(0)    收藏  举报