题目来源
洛谷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;
}