標籤: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
22040
Sample Output
1 7 191 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水果