队列训练
题目链接:http://acm.hust.edu.cn/vjudge/contest/view.action?cid=83498#problem/C
题目:
Description
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
Input
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
Output
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
Sample Input
2
20
40
Sample Output
1 7 19
1 19 37
题解:
将n个士兵的编号用一个数组记入,后从i(1~n)依次对2或3进行除运算(2,3交替进行),
如果余数不为0的数,用标号数组下标为i-1的数将编号数组进行更新。如此循环直到编号数组的数(队列中的士兵数)小于等于3时结束循环。
代码:
#include<iostream> using namespace std; int a[5000]; int main() { int i,t,n,j,b; cin>>t; while(t--) { cin>>n;b=2;j=n; for(i=0;i<n;i++) a[i]=i+1; while(n>3) { j=0;i=1; while(i<=n) { if(i%b!=0) {a[j]=a[i-1]; j++; } i++; } n=j; if(b==2) b=3; else b=2; } for(i=0;i<n-1;i++) cout<<a[i]<<' '; if(i==n-1) cout<<a[i]<<endl; } return 0; }