標籤:hdu1276
點擊開啟連結
有人說這題屬於棧或者隊列,個人覺得說集合應該比較準確點。
Problem Description某部隊進行新兵隊列訓練,將新兵從一開始按順序依次編號,並排成一行橫隊,訓練的規則如下:從頭開始一至二報數,凡報到二的出列,剩下的向小序號方向靠攏,再從頭開始進行一至三報數,凡報到三的出列,剩下的向小序號方向靠攏,繼續從頭開始進行一至二報數。。。,以後從頭開始輪流進行一至二報數、一至三報數直到剩下的人數不超過三人為止。
Input本題有多個測試資料群組,第一行為組數N,接著為N行新兵人數,新兵人數不超過5000。
Output共有N行,分別對應輸入的新兵人數,每行輸出剩下的新兵最初的編號,編號之間有一個空格。
Sample Input
22040
Sample Output
1 7 191 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集合水過