士兵队列训练问题

                       士兵队列训练问题

某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。 

Input

本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。 
Output

共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。 

Sample Input

2
20
40

Sample Output1 7 19

 1 7 19

  1 19 37

本题的思路比较简单,解法有很多种,可用队列数组,等等,

但是本题的坑也比较多,首先,如果人数小于3的话,直接输出全部就行了;其次,如果大于3不一定一定要输出3个,将士兵遍历完,如果士兵的个数小于或者等于3就输出。

代码:

 1 #include<stdio.h>
 2 #include<vector>
 3 #include<iostream>
 4 using namespace std;
 5 int n,m;
 6 vector<int> q;
 7 int main(){
 8     freopen("in.txt","r",stdin);
 9     scanf("%d",&n);
10     while(n--){
11         q.clear();
12         scanf("%d",&m);
13         for(int i=1;i<=m;i++){
14             q.push_back(i);
15         }
16         if(m<=3){   
17             for(int i=0;i<q.size();i++){
18                 printf("%d%c",q[i],i==q.size()-1?'
':' ');
19             }
20         }
21         else{
22             while(1){
23                 for(int i=1;i<q.size();i++){
24                     q.erase(q.begin()+i);
25                    // if(q.size()==3) break;
26                 }
27                 if(q.size()<=3)  break;
28                 for(int i=2;i<q.size();i=i+2){
29                     q.erase(q.begin()+i);
30                    // if(q.size()==3) break;
31                 }
32                 if(q.size()<=3) break;
33             }
34             for(int i=0;i<q.size();i++){
35                 printf("%d%c",q[i],i==q.size()-1?'
':' ');
36             }
37         }
38     }
39 }
原文地址:https://www.cnblogs.com/muziqiu/p/7278682.html