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

點擊打開鏈接

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

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()+" ");
				}
			}
		}
	}

}




發佈了148 篇原創文章 · 獲贊 29 · 訪問量 17萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章