有人说这题属于栈或者队列,个人觉得说集合应该比较准确点。
Problem Description
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
Input
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
Output
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
Sample Input
2 20 40
Sample Output
1 7 19 1 19 37
注意:
这里要注意题目说的报数一二,是指所有人中按顺序报完为后,再进行报一二三。如有:
第一次报数一二:人员:1 2 3 4 5 6 7 8 9 10
报数:1 2 1 2 1 2 1 2 1 2
第二次报数一二三:人员:1 3 5 7 9
报数: 1 2 3 1 2
如此循环上面两步,知道人员人数不超过三为止。
还有一个细节就是在输出是,控制一下格式问题,最后一个后面不能有空格
代码:
import java.util.Iterator; import java.util.LinkedList; import java.util.Scanner; public class P1276 { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int n=sc.nextInt(); int num; LinkedList<Integer> list; while(n-->0){ num=sc.nextInt(); list=new LinkedList<Integer>(); for(int i=0;i<num;i++){//向集合中添加人员 list.add(i+1); } // Iterator<Integer> it=queue.iterator(); // while(it.hasNext()){ // System.out.print(it.next()+" "); // } boolean flag=true; while(list.size()>3){ //System.out.println(list.size()); if(flag){//控制一二和一二三模式之间互相进行 for(int i=1;i<list.size();i+=1){ // System.out.print(list.get(i)+" "); list.remove(i);//除去喊到二的人 flag=false; } // System.out.println(); }else{ for(int i=2;i<list.size();i+=2){ // System.out.print(list.get(i)+" "); list.remove(i);//除去喊到三的人 flag=true; } // System.out.println(); } } int remainNum=list.size();//必须提前把结果人数记录下来 Iterator<Integer> it=list.iterator(); int count=0;//用来控制最后一个空格问题 while(it.hasNext()){ count++; if(count==remainNum){//这里不能用list.size(),因为在输出结果是,相应的元素已经出去了,所有size改变了 System.out.println(it.next()); }else{ System.out.print(it.next()+" "); } } } } }
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-10-07 06:47:10