士兵队列训练问题
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
Input
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
Output
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
Sample Input
2 20 40
Sample Output1 7 19
1 7 19
1 19 37
本题的思路比较简单,解法有很多种,可用队列数组,等等,
但是本题的坑也比较多,首先,如果人数小于3的话,直接输出全部就行了;其次,如果大于3不一定一定要输出3个,将士兵遍历完,如果士兵的个数小于或者等于3就输出。
代码:
1 #include<stdio.h> 2 #include<vector> 3 #include<iostream> 4 using namespace std; 5 int n,m; 6 vector<int> q; 7 int main(){ 8 freopen("in.txt","r",stdin); 9 scanf("%d",&n); 10 while(n--){ 11 q.clear(); 12 scanf("%d",&m); 13 for(int i=1;i<=m;i++){ 14 q.push_back(i); 15 } 16 if(m<=3){ 17 for(int i=0;i<q.size();i++){ 18 printf("%d%c",q[i],i==q.size()-1?' ':' '); 19 } 20 } 21 else{ 22 while(1){ 23 for(int i=1;i<q.size();i++){ 24 q.erase(q.begin()+i); 25 // if(q.size()==3) break; 26 } 27 if(q.size()<=3) break; 28 for(int i=2;i<q.size();i=i+2){ 29 q.erase(q.begin()+i); 30 // if(q.size()==3) break; 31 } 32 if(q.size()<=3) break; 33 } 34 for(int i=0;i<q.size();i++){ 35 printf("%d%c",q[i],i==q.size()-1?' ':' '); 36 } 37 } 38 } 39 }