1. 程式人生 > >hdu1276(士兵隊列訓練問題) java集合水過

hdu1276(士兵隊列訓練問題) java集合水過

popu show ring -a 人員 next () oid courier

點擊打開鏈接

有人說這題屬於棧或者隊列,個人認為說集合應該比較準確點。

Problem Description

某部隊進行新兵隊列訓練,將新兵從一開始按順序依次編號。並排成一行橫隊,訓練的規則例如以下:從頭開始一至二報數,凡報到二的出列。剩下的向小序號方向靠攏,再從頭開始進行一至三報數。凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。。。

,以後從頭開始輪流進行一至二報數、一至三報數直到剩下的人數不超過三人為止。


Input

本題有多個測試數據組。第一行為組數N,接著為N行新兵人數,新兵人數不超過5000。

Output

共同擁有N行,分別相應輸入的新兵人數,每行輸出剩下的新兵最初的編號,編號之間有一個空格。



Sample Input

2
20
40

Sample Output

1 7 19
1 19 37

註意:

這裏要註意題目說的報數一二。是指全部人中按順序報完為後,再進行報一二三。如有:

第一次報數一二:人員:1 2 3 4 5 6 7 8 9 10

報數:1 2 1 2 1 2 1 2 1 2

第二次報數一二三:人員:1 3 5 7 9

報數: 1 2 3 1 2

如此循環上面兩步。知道人員人數不超過三為止。

另一個細節就是在輸出是,控制一下格式問題,最後一個後面不能有空格

代碼:

import java.util.Iterator;
import java.util.LinkedList;
import java.util.Scanner;

public class P1276 {

	public static void main(String[] args) {
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int num;
		LinkedList<Integer> list;
		while(n-->0){
			num=sc.nextInt();
			list=new LinkedList<Integer>();
			for(int i=0;i<num;i++){//向集合中加入人員
				list.add(i+1);
			}
//			Iterator<Integer> it=queue.iterator();
//			while(it.hasNext()){
//				System.out.print(it.next()+" ");
//			}
			boolean flag=true;
			while(list.size()>3){
				//System.out.println(list.size());
				if(flag){//控制一二和一二三模式之間互相進行
					for(int i=1;i<list.size();i+=1){
//						System.out.print(list.get(i)+" ");
						list.remove(i);//除去喊到二的人
						flag=false;
					}
//					System.out.println();
				}else{
					for(int i=2;i<list.size();i+=2){
//						System.out.print(list.get(i)+" ");
						list.remove(i);//除去喊到三的人
						flag=true;
					}
//					System.out.println();
				}
			}
			int remainNum=list.size();//必須提前把結果人數記錄下來
			Iterator<Integer> it=list.iterator();
			int count=0;//用來控制最後一個空格問題
			while(it.hasNext()){
				count++;
				if(count==remainNum){//這裏不能用list.size(),由於在輸出結果是,對應的元素已經出去了。全部size改變了
					System.out.println(it.next());
				}else{
					System.out.print(it.next()+" ");
				}
			}
		}
	}

}




hdu1276(士兵隊列訓練問題) java集合水過