题意:n个学生坐成一个圆圈,每人初始有一些糖果。老师吹一次口哨,每个学生同时把ta的一半糖果给右边的学生。结束时如果有学生糖果为奇数,则补一颗。当所有学生都有相同数量的糖果时,游戏结束。模拟游戏,确定老师吹口哨的次数,和最终学生的糖果数。
输入:每一组数据先输入n,接下来的n行表示逆时针方向每个学生初始的糖果数目。
输出:两个整数,以空格隔开,分别代表老师吹口哨的次数和最终每个学生的糖果数。
#include<stdio.h>
int n;
int whistle; // 吹口哨的次数
int candy[50];
int judge() // 判断每个孩子的糖果是否一样
{
for(int i =0;i<n-1;i++)
{
if(candy[i] != candy[i+1])
return 0;
}
return 1;
}
void function()
{
whistle = 0;
int lost[n],get[n]; // 分别代表每一个孩子给出去的糖果和得到的糖果
while(1)
{
if (judge()) // 每个孩子的糖果都一样
{
printf("%d %d\n", whistle, candy[0]);
return;
}
else // 进行一轮游戏
{
for(int i = 0;i<n;i++) // 对每一个孩子更新其lost和get数组
{
int left = (i+1)%n;// 获得左手边的邻居的糖果
lost[i] = candy[i] /2;
get[i] = candy[left] / 2;
}
for(int i = 0;i<n;i++)// 进行糖果的传递
candy[i] = candy[i] -lost[i] + get[i];
for(int i = 0;i<n;i++)// 给拿到奇数糖果的孩子补一糖果
{
if(candy[i] %2 )
candy[i]++;
}
whistle ++;
}
}
}
int main()
{
int i;
while(scanf("%d",&n) != EOF && n)
{
i = 0;
scanf("%d",&candy[i]); // 逆时针获取糖果
for(i = (i-1+n)%n;i!=0;i=(i-1+n)%n)
scanf("%d",&candy[i]);
function();
}
return 0;
}
京公网安备 11010502036488号