poj 3750 小孩报数问题

小孩报数问题
Time Limit: 1000MS   Memory Limit: 65536K
Total Submissions: 10523   Accepted: 4882

Description

有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

Source

 

模拟

做法一:

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<cstring>
 4 #include<iostream>
 5 #include<queue>
 6 using namespace std;
 7 struct point{
 8     string name;
 9     int num;
10 };
11 point p[65];
12 int main(){
13     int n,s,w;
14     while(cin>>n){
15         int i=1;
16         for(;i<=n;i++){
17             cin>>p[i].name;
18             p[i].num=i;
19         }
20         char c;
21         scanf("%d,%d",&w,&s);//输入尽量用scanf
22         //cout<<w<<" "<<s<<endl;
23         queue<int> st;
24         i=w;
25         int num=1;
26         for(;;i++){
27             if(i==n+1){
28                 i=1;
29             }
30             if(p[i].num){
31                 if(num==s){
32                     //cout<<i<<endl;
33                     num=1;//下一个数的编号 
34                     st.push(i);
35                     p[i].num=0;
36                     if(st.size()==n){
37                         break;
38                     }
39                 }
40                 else{
41                     num++;
42                 }
43             }
44         }
45         for(i=0;i<n;i++){
46             cout<<p[st.front()].name<<endl;
47             st.pop();
48         }
49     }
50     return 0;
51 }

 

做法二:

 

posted @ 2015-02-25 10:43  Deribs4  阅读(429)  评论(0编辑  收藏  举报