HDU 1276 士兵队列训练问题

Problem Description
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
 
Input
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
 
Output
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
 
Sample Input
2
20
40
 
Sample Output
1 7 19
1 19 37
 

题意:略。

分析:直接进行模拟,虽然算法有点笨。

AC源代码(C语言):

 1 #include<stdio.h>
 2 
 3 int main()
 4 {
 5     int data[5001];
 6     int i,N,T,a,b;
 7     scanf("%d",&N);
 8     while(N--)
 9     {
10         scanf("%d",&T);
11         a=T;
12 
13         for(i=1;i<=T;i++)
14             data[i]=i;
15         while(a>3)              //这里不能用do--while,因为当输入的T小于3时,不进入循环!否则程序是WA!
16         {
17             b=0;
18             for(i=1;i<=T;i++)
19             {
20                 if(data[i]==0) continue;
21                 else  b+=1;
22                 if(b==2)
23                 {
24                     data[i]=0;
25                     b=0;
26                 }
27             }
28             a=a-a/2;
29             if(a<=3) break;
30             b=0;
31             for(i=1;i<=T;i++)
32             {
33                 if(data[i]==0) continue;
34                 else b+=1;
35                 if(b==3)
36                 {
37                     data[i]=0;
38                     b=0;
39                 }
40             }
41             a=a-a/3;
42         }
43         b=0;
44         for(i=1;i<=T;i++)
45         {
46             if(data[i]==0) continue;
47             else
48             {
49                 b+=1;
50                 if(b==a)
51                     printf("%d\n",data[i]);
52                 else
53                     printf("%d ",data[i]);
54             }
55         }
56     }
57     return 0;
58 }

 2013-05-14

原文地址:https://www.cnblogs.com/fjutacm/p/3077041.html