hdu1276 Java水果

来源:互联网 发布:mac怎么创建压缩文件夹 编辑:程序博客网 时间:2024/05/01 12:40

 

士兵队列训练问题

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
22040
 

Sample Output
1 7 191 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(); }}}
结果截图:




1 0