题意: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; }