hdu1276 Java水果

 

士兵队列训练问题

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

hdu1276 Java水果_第1张图片


你可能感兴趣的:(Java链表,hdu1276)