6 36 2 2 2 2 2 11 22 20 18 16 14 12 10 8 6 4 2 4 2 4 6 8 0
15 14 17 22 4 8HintThe game ends in a finite number of steps because: 1. The maximum candy count can never increase. 2. The minimum candy count can never decrease. 3. No one with more than the minimum amount will ever decrease to the minimum. 4. If the maximum and minimum candy count are not the same, at least one student with the minimum amount must have their count increase.
//这题是一道简单模拟,注意处理边界条件就行了!
#include<iostream>
#include<cstdio>
#define N 100
using namespace std;
int main()
{
int s[N],n,i,k,t,p;
while(scanf("%d",&n) == 1 && n)
{
for(i=0;i<n;i++)
scanf("%d",s+i);
for(k=1;;k++)
{
t=s[n-1]/2; //首先t存取最后一个人糖果数的一半,即处理边界条件!
for(i=0;i<n;i++)
{
p=s[i]/2; //p存取当前糖果数的一半用来给右边的同学
s[i]=s[i]/2+t; //自己减一半再加上左边同学给的一半
t=p; //给完一个同学当然换下一个
if(s[i]%2!=0) //当前处理完如果为奇数,那就还得收老师一个
s[i]++;
}
t=s[0];
for(i=1;i<n&&s[0]==s[i];i++); //如果每个同学拥有的糖果数相同则游戏结束!
if(i==n)
{
break;
}
}
printf("%d %d\n",k,t); //输出游戏次数和每个人最终的糖果数
}
return 0;
}
HDU-1034-Candy Sharing Game(C++ && 简单模拟)
原文地址:http://blog.csdn.net/qq_16542775/article/details/46237975