hdu1276(士兵隊列訓練問題) java集合水過
阿新 • • 發佈:2017-05-29
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集合水過