士兵队列训练报数问题

题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83498#problem/C

题意:

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

       输入行:多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。

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

案例:

       Sample Input

       2

       20

       40

       Sample Output

       1 7 19

       1 19 37

分析:

       给士兵编号,若出列,则编号变为0,进行一次出列后进行人数检验,若不多于三人结束出列语句循环,注意输出格式控制,具体实施步骤如下:

源代码:

 1 #include<stdio.h>
 2 const int maxm=5005;
 3 int a[maxm];
 4 int main()
 5 {
 6     int N,T,k,i,j;
 7     scanf("%d",&N);//案例数 
 8     while(N--)
 9     {
10         scanf("%d",&T);//士兵人数
11         k=T;
12         for(i=1;i<=T;i++)//士兵编号
13             a[i]=i;
14         while(k>3)//士兵出队后人数判断语句
15         {
16             j=0;
17             for(i=1;i<=T;i++)
18             {
19                 if(a[i]==0) continue;//判别该编号士兵是否已出列
20                 else j++;
21                 if(j==2)//报2士兵出列
22                 {  a[i]=0;
23                    j=0;
24                 }
25             }
26             k-=k/2;//报2出列后剩余人数
27             if(k<=3) break;//士兵报2出队后人数判断语句
28             j=0;
29             for(i=1;i<=T;i++)
30             {
31                 if(a[i]==0) continue;//判别该编号士兵是否已出列
32                 else j++;
33                 if(j==3)//报3士兵出列
34                 {  a[i]=0;
35                    j=0;
36                 }
37             }
38             k-=k/3;//报3出列后剩余人数
39         }
40         for(i=1;i<=T;i++)
41         {
42             if(a[i]==0) continue;//判断士兵出队
43             else //输出格式控制
44             {   k--;
45                 if(k>0)
46                  printf("%d ",a[i]);
47                 else printf("%d\n",a[i]);
48             }
49         }
50     }
51     return 0;
52 }

 

posted @ 2015-07-25 16:22  ~瞬间*  阅读(6629)  评论(0编辑  收藏  举报