新兵训练(=@__@=)

 

题意:

 

Description

 

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

 

 

 

Input

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

 

Output

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

 

Sample Input

2
20
40
 

 

Sample Output

1 7 19
1 19 37
 
 
思路:
         士兵1-2报数时,用循环加公式i % 2 + 1 == 2把报到2的士兵找出来,将他们的编号变大,计算剩下的人,重新从大到小排列,士兵1-3报数也是如此。最后剩下三人就只要输出数组的前三个数就好了。
 
 
源代码:
 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 #define maxn 5000
 5 int main()
 6 {
 7     int t;
 8     cin >> t;
 9     while (t--)
10     {
11         int count=0;
12         int a[maxn],num;
13         cin >> num;
14         int num1 = num;
15         for (int i = 0; i < num; i++)
16         {
17             a[i]=i+1;
18         }
19         while (num> 3)
20         {
21             for (int i = 0; i < num; i++)
22             {
23                 if (i % 2 + 1 == 2)
24                 {
25                     a[i] =num1+1;      //报数为2的士兵,编号变大。
26                     count++;
27                 }
28 
29             }
30             sort(a, a + num);         //重新排序,让剩下的士兵排到前面。
31             num= num - num/2;        //计算剩下的人
32 
33             if (num<= 3)
34             {
35                 break;
36             }
37             else
38             {
39                 for (int i = 0; i < num; i++)
40                 {
41                     if (i%3+1== 3)
42                     {
43                         a[i] = num1+1;//   把不要的数变大,以便后面排序时在后面。
44                     }
45 
46                 }
47                 sort(a, a + num);
48                 num = num -num/3;
49 
50             }
51         }
52         for (int i = 0; i < num-1; i++)
53         {
54             cout << a[i] << " ";          //输出最后的三人
55         }
56         cout << a[num - 1] << endl;      
57     }
58     
59     return 0;
60 }

 

 

心得:

       感觉良好。。。加油!

 

posted @ 2015-07-24 23:11  白一  阅读(356)  评论(0编辑  收藏  举报