题目:
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 }