士兵队列训练问题

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

Input本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。 
Output共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。 
Sample Input

2
20
40

Sample Output

1 7 19
1 19 37

水题
 1 #include <iostream>
 2 
 3 using namespace std;
 4 #include<stack>
 5 #include<stdio.h>
 6 #include<math.h>
 7 #include<string.h>
 8 #include<map>
 9 #include<queue>
10 int main()
11 {
12     int t,a[5010],n,i;
13     cin>>t;
14     while(t--)
15     {
16         cin>>n;
17         if(n==1)
18         {
19             cout<<"1"<<endl;
20             continue;
21         }
22         if(n==2)
23         {
24             cout<<"1 2"<<endl;
25             continue;
26         }
27         if(n==3)
28         {
29             cout<<"1 2 3"<<endl;
30             continue;
31         }
32         for(i=1;i<=n;i++)
33             a[i]=1;
34         int sum=10086;
35         int add;
36         while(sum>3)
37         {
38             add=0;
39             sum=0;
40             for(i=1;i<=n;i++)
41             {
42                 if(a[i]==1)
43                     {
44                         add++;
45                         if(add%2==0)
46                             {
47                                 a[i]--;
48                                 //cout<<i<<"****"<<add<<endl;
49                             }
50                     }
51             }
52             for(i=1;i<=n;i++)
53             {
54                 if(a[i]==1)
55                     sum++;
56             }
57             if(sum<=3)
58                 break;
59             add=0;
60             sum=0;
61             for(i=1;i<=n;i++)
62             {
63                 if(a[i]==1)
64                     {
65                         add++;
66                         if(add%3==0)
67                             {
68                                 a[i]--;
69                                 //cout<<i<<"****"<<add<<endl;
70                             }
71                     }
72             }
73             for(i=1;i<=n;i++)
74             {
75                 if(a[i]==1)
76                     sum++;
77             }
78             if(sum<=3)
79                 break;
80         }
81         int flag=1;
82         for(i=1;i<=n;i++)
83         {
84             if(a[i]==1)
85             {
86                 if(flag)
87                 {
88                     flag=0;
89                     cout<<i;
90                     continue;
91                 }
92                 cout<<' '<<i;
93             }
94         }
95         cout<<endl;
96     }
97     return 0;
98 }
View Code
原文地址:https://www.cnblogs.com/dulute/p/7272466.html