https://vjudge.net/contest/352887#problem/F
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
Input
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
Output
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
Sample Input
2 20 40
Sample Output
1 7 19 1 19 37
import java.util.*;
public class Main {
static Scanner sc=new Scanner(System.in);
static Queue<Integer> q=new LinkedList<Integer>();
public static void main(String[] args) {
int T=sc.nextInt();
while(T-->0) {
int n=sc.nextInt();
q.clear();
for(int i=1;i<=n;i++) q.offer(i);
while(true) {
if(q.size()<=3) break;
q.offer(q.poll());
for(int i=2;q.peek()!=1;i++) {
if(i%2!=0) q.offer(q.poll());
else q.poll();
}
if(q.size()<=3) break;
q.offer(q.poll());
for(int i=2;q.peek()!=1;i++) {
if(i%3!=0) q.offer(q.poll());
else q.poll();
}
}
boolean flag=true;
while(!q.isEmpty()) {
if(!flag) System.out.print(" "+q.poll());
else {
flag=false;
System.out.print(q.poll());
}
}
System.out.println();
}
}
}
来源:CSDN
作者:永夜莫明
链接:https://blog.csdn.net/qq_42936517/article/details/104065878