设牌的总数为cnt,平均数ave=cnt/n。
先考虑一个人,若al>ave,则第一堆需要给第二堆a1-ave张牌,若a1<ave,则第-堆需要从第二堆拿ave-a1张纸牌。
二、按照同样的方法考虑第2-n堆,则可以得到最小移动次数为从1到n|i* ave-sum[i]|的和,sum[i]是a[i]的前缀和。
三、若一开始a[i]=a[i]-ave,即让每堆都减去ave,则最终每堆都有0张纸牌。所以最后当sum[i]=0的时候,当时的次数就是最小次数。
#include <bits/stdc++ . h>
using namespace std;
int main( )
{
int n,ans=0,ave,cnt=0;
cin >> n;
int a[ 10000] , sum[ 10000];
for(int i=1;i<=n;i++)
{
cin >>a[i] ;
cnt+=a[i] ;
}
ave=cnt/n;
sum[ 0]= 0;
for(int i=1;i<=n;i++)
sum [i]=sum[i-1]+a[i]-ave;
if( sum[i] )
ans++ ;
}
cout << ans << endl ;
return 0 ;
}