士兵队列训练问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 9842 Accepted Submission(s): 4311
Problem Description
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
Input
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
Output
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
Sample Input
2 20 40
Sample Output
1 7 19 1 19 37
/** * date:2017.11.10 * author:孟小德 * function:acm1276 * 士兵队列问题 */ import java.util.*; public class acm1276 { public static void main(String[] args) { Scanner input = new Scanner(System.in); int num = input.nextInt(); int[] list_size = new int[num]; ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>(); for (int i=0;i<num;i++) { list.add(new ArrayList<Integer>()); list_size[i] = input.nextInt(); } for (int i=0;i<num;i++) { assignment(list.get(i),list_size[i]); // list_size[i] = input.nextInt(); ArrayList<Integer> delete_list = new ArrayList<Integer>(); while (list.get(i).size() > 4) { //士兵1 2 报数 number_off(list.get(i),delete_list,2); //士兵出列 if (delete_list.size() > 0) { delete(list.get(i),delete_list); } delete_list.clear(); //士兵1 2 3 报数 if (list.get(i).size() > 4) { number_off(list.get(i),delete_list,3); } else { break; } // 士兵出列 if (delete_list.size() > 0) { delete(list.get(i),delete_list); } delete_list.clear(); } } for (int i=0;i<num;i++) { if (list.get(i).size() == 2) { System.out.print(list.get(i).get(1)); } else if (list.get(i).size() > 2) { System.out.print(list.get(i).get(1)); for (int j=2;j<list.get(i).size();j++) { System.out.print(" " + list.get(i).get(j)); } } System.out.println(); } } //给list列表赋值下标与值对应,第一个赋值为0 public static void assignment(ArrayList<Integer> list,int list_size) { for (int i=0;i<=list_size;i++) { list.add(i); } } //士兵出列 public static void delete(ArrayList<Integer> list,ArrayList<Integer> delete_list) { for (int i=delete_list.size()-1;i>=0;i--) { int n = delete_list.get(i); list.remove(n); // System.out.println(delete_list.get(i) + " " + list.size()); } } //士兵报数 public static void number_off(ArrayList<Integer> list, ArrayList<Integer> delete_list,int n) { for (int i = 1;i<list.size();i++) { if (i%n == 0) { delete_list.add(i); } } } }