B - 小孩报数问题

版权声明: https://blog.csdn.net/nucleare/article/details/79966196

B - 小孩报数问题

 
有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

代码(list实现):

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<list>
using namespace std;

int main(void)
{
	list<string> lis;
	string s1;
	int t,i,n,m,w,s;
	scanf("%d",&n);
	for(i=0;i<n;i++)
	{
		cin>>s1;
		lis.push_back(s1);
	}
	scanf("%d,%d",&w,&s);//被题目的逗号坑了好久。。
	list<string>::iterator it=lis.begin();
	for(i=1;i<w;i++)
	{
		it++;
	}
	i=1;
	while(!lis.empty())
	{
		i=1;
		while(i<s)
		{
			++it;
			++i;
			if(it==lis.end())
			{
				it=lis.begin();
			}
		}
		cout<<*it<<endl;
		it=lis.erase(it); 
		if(it==lis.end())
		{
			it=lis.begin();
		}
		if(lis.size()==1)
		{
			cout<<lis.front()<<endl;
		    lis.pop_back(); 
		    break;
		}
	}
	return 0;
} 
代码(数组实现):


#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>

using namespace std;


int main(void)
{
	int idex[70];
	string s1[70];
	int m,n,w,s,i,j,k;
	scanf("%d",&n);
	for(i=1;i<=n;i++)
	{
		cin>>s1[i];
		idex[i]=0;
	}
	scanf("%d,%d",&w,&s);
	i=w;
	k=s;
	m=n;
	while(m)
	{
		if(idex[i]==0)
		{
			k--;
			if(k==0)
			{
				cout<<s1[i]<<endl;
				idex[i]=1;
				m--;
			    k=s;
			}
		}
		i++;
		if(i>n)
		i=1;
	}
	return 0;
 } 


阅读更多

没有更多推荐了,返回首页