2015 HUAS Summer Training#2 C

题目:

Description

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

Input

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

Output

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

解题思路:用一个循环排除2的,一个循环排除3的。

代码:

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 const int maxn=5000+10;
 5 int main()
 6 {
 7     int n,cur,i,N,j,k;
 8     int a[maxn],s[maxn],b[maxn];
 9       cin>>n;
10         while(n--)
11         {
12             cin>>N;
13             for(i=0;i<N;i++)
14             {
15                 a[i]=i+1;
16                 b[i]=0;
17             }
18             if(N>3)
19             {
20                 k=N;
21                 while(1)
22                 {
23                     memcpy(s,b,sizeof(s));
24                     for(i=1,cur=2;cur<k;i++,cur+=2)
25                     {    
26                         s[0]=a[0];             
27                         s[i]=a[cur];
28                     }
29                     i=0;
30                     for(j=0;j<N;j++)
31                     {
32                         if(s[j]!=0)
33                             i++;
34                         else break;
35                     }
36                     if(i<=3)
37                     {
38                         for(j=0;j<i;j++)
39                         {
40                             
41                             if(j==i-1)
42                                 cout<<s[j]<<endl;
43                             else 
44                                 cout<<s[j]<<" ";
45                         }
46                         break;
47                     }
48                     memcpy(a,b,sizeof(a));
49                     for(k=0,cur=0;cur<i;k++,cur++)
50                     {
51                         if((cur+1)%3==0)
52                             cur++;
53                         a[k]=s[cur];
54                     }
55                     k=0;
56                     for(j=0;j<N;j++)
57                     {
58                         if(a[j]!=0)
59                             k++;
60                         else break;
61                     }
62                     if(k<=3)
63                     {
64                         for(j=0;j<k;j++)
65                         {
66                             if(j==k-1)
67                                 cout<<a[j]<<endl;
68                             else 
69                                 cout<<a[j]<<" ";
70                         }
71                         break;
72                     }
73                 }
74             }
75             else 
76             {
77                 for(i=0;i<N;i++)
78                 {
79                     if(i==N-1)
80                         cout<<a[i]<<endl;
81                     else cout<<a[i]<<" ";
82                 }
83             }
84         }
85         return 0;
86 }

 

 
posted on 2015-07-24 20:56  最爱剪刀手  阅读(120)  评论(0编辑  收藏  举报