军训队列问题,Java版

题目描述

某大学开学进行军训队列训练,将学生从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列剩下的依次向前靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的依次向前靠拢,继续从头开始进行一至二报数。。。以后每次从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。

输入

第一行为组数N,接着为N行学生人数,学生人数不超过5000。

输出

输出有N行,分别对应输入的学生人数,每行输出剩下的学生最初的编号,编号之间有一个空格。

样例输入

2

20

40

样例输出

1 7 19

1 19 37

import java.util.ArrayList;
import java.util.Scanner;

/**
 * Created by Administrator on 2016/9/16.
 */
class People{
    int number;
    People(int i){
        this.number = i;
    }
}
public class CountQueue {
    public static void main(String[] args){
        Scanner  scan = new Scanner(System.in);
        int number = scan.nextInt();
        for(int i = 0; i < number; i++) {
            int num = scan.nextInt();
            ArrayList<People> peo = new ArrayList<>(num);
            for(int j = 1; j <= num; j++){
                People p  = new People(j);
                peo.add(p);
            }
            ArrayList<People> newPeo = new ArrayList<>();
            while(peo.size()> 3){
                for(int k = 1; k <= peo.size(); k++){
                    if(k%2 != 0 ){
                        newPeo.add(peo.get(k -1)); 
                    }
                }
                peo.clear();
                peo = (ArrayList<People>) newPeo.clone();
                newPeo.clear();
                if(peo.size() > 3) {
                    for(int k = 1; k <= peo.size(); k++){
                        if(k%3 != 0){
                            newPeo.add(peo.get(k -1));
                        }
                    }
                    peo.clear();
                    peo = (ArrayList<People>) newPeo.clone();
                    newPeo.clear();
                }
            }
            for(People a : peo){
                System.out.print(a.number + " ");
            }
            System.out.println();
        }
    }
}

    原文作者:舞伴问题
    原文地址: https://blog.csdn.net/renjie223/article/details/52554791
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞