士兵队列训练问题
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 4656 Accepted Submission(s): 2175
Problem Description
某部队进行新兵队列训练,将新兵从一开始按顺序依次编号,并排成一行横队,训练的规则如下:从头开始一至二报数,凡报到二的出列,剩下的向小序号方向靠拢,再从头开始进行一至三报数,凡报到三的出列,剩下的向小序号方向靠拢,继续从头开始进行一至二报数。。。,以后从头开始轮流进行一至二报数、一至三报数直到剩下的人数不超过三人为止。
Input
本题有多个测试数据组,第一行为组数N,接着为N行新兵人数,新兵人数不超过5000。
Output
共有N行,分别对应输入的新兵人数,每行输出剩下的新兵最初的编号,编号之间有一个空格。
Sample Input
2 20 40
Sample Output
1 7 19 1 19 37
解题思路:其实这是一个水的不能再水的题目,用两个数组交替变换值,根据题意利用数组下标把该去除的去除掉。不过博主用的是JavaArryList,毕竟ArryList不是我自己写的所以用起来就一直查API,然后各种问题,因为ArryList中的list.remove(int index)函数是把该下标元素去除,并且顺势把list改变,所以使用的时候一定需要注意这些细节,不然真的浪费时间。
代码实现:
import java.util.ArrayList; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); ArrayList<Integer> list = new ArrayList<Integer>(); // 利用ArrayList实现排队 int n = sc.nextInt(); // 接收下面有多少组测试数据 while (n-- > 0) { int count = sc.nextInt(); // 接收有多少人排队 // 赋值,把每个人的编号add()到链表list中 for (int i = 1; i <= count; i++) { list.add(i); } boolean flag = true; //利用标记来实现两种方式的交替 while (list.size() > 3) { if (flag) { for (int i = 1; i < list.size(); i++) { list.remove(i); //直接移除是2的倍数的数值 } flag = false; } else { for (int j = 2; j < list.size(); j += 2) { list.remove(j); //直接移除是3的倍数的数值 } flag = true; } } System.out.print(list.remove(0));//输出第一个数值 while (!list.isEmpty()) { //每次取出第一个数值,直到list为空 System.out.print(" " + list.remove(0)); } System.out.println(); } } }
结果截图:
版权声明:本文为博主原创文章,未经博主允许不得转载。
时间: 2024-11-09 00:37:27