題目來源
洛谷P1031均分紙牌
https://www.luogu.org/problem/show?pid=1031
思路
輸入後將每堆紙牌的數量減去平均數
即爲這堆紙牌應被移給或應移給別的堆的紙牌數量
若第i堆紙牌數大於0 則第i+1堆紙牌數加上第i堆紙牌數
即將第i堆剩下的紙牌全部移到下一堆 移動次數加一
若第i堆紙牌數小於0 則第i+1堆紙牌數加上第i堆紙牌數(絕對值)
即當第i+1~n堆紙牌數均爲目標數量後剩下的紙牌全部移到這一堆 移動次數加一
若第i堆紙牌數大於0 則第1~i堆紙牌數已均爲目標數量
即沒有紙牌需要通過第i堆牌向左移動
代碼(C++)
#include <cstdio>
using namespace std;
int n,i,m=0,ans=0,num[200010];
int main()
{
scanf("%d",&n);
for(i=1;i<=n;++i)
scanf("%d",&num[i]),m+=num[i];
m=m/n;
for(i=1;i<n;++i)
{
num[i]-=m;
if(num[i]!=0)
++ans,num[i+1]+=num[i];
}
printf("%d",ans);
return 0;
}