小孩报数问题(3750)

有N个小孩围成一圈,给他们从1开始依次编号,现指定从第W个开始报数,报到第S个时,该小孩出列,然后从下一个小孩开始报数,仍是报到S个出列,如此重复下去,直到所有的小孩都出列(总人数不足S个时将循环报数),求小孩出列的顺序。

Input

第一行输入小孩的人数N(N<=64) 
接下来每行输入一个小孩的名字(人名不超过15个字符) 
最后一行输入W,S (W < N),用逗号","间隔

Output

按人名输出小孩按顺序出列的顺序,每行输出一个人名

Sample Input

5
Xiaoming
Xiaohua
Xiaowang
Zhangsan
Lisi
2,3

Sample Output

Zhangsan
Xiaohua
Xiaoming
Xiaowang

Lisi

约瑟夫环

#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <cctype>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <deque>
#include <queue>
#include <set>
#include <list> 
#include <map> 
#include <string>
using namespace std; 
#define infinity 2147483647
 
int main()
{
	int n,i,j,w,m,count,num;
	char s[65][20];
	int flag[65];
	while(scanf("%d",&n)!=EOF)
	{
		for(i=1;i<=n;i++)
		flag[i]=1;
		
		for(i=1;i<=n;i++)
		scanf("%s",s[i]);
		
		scanf("%d,%d",&w,&m);
		count=0;
		num=0;
		for(i=w;i<=n;)
		{
			if(flag[i])
			{
				count++;
			}
			
			if(count==m)
			{
				cout <<s[i] <<endl;
				count=0;
				flag[i]=0;
				num++;
			}
			if(num==n-1)
			{
				for(j=1;j<=n;j++)
				{
					if(flag[j])
					{
						cout <<s[j] <<endl;
						break;
					}
				}
				break;
			}
			if(i==n)//回到头
			i=1;
			else
			i++;
		}
	
	} 
			
	return 0;
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章