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;
}