CCF201609 火車購票(JAVA)
阿新 • • 發佈:2018-11-15
問 題 描述: |
問題描述 請實現一個鐵路購票系統的簡單座位分配演算法,來處理一節車廂的座位分配。 輸入格式 輸入的第一行包含一個整數n 第二行包含n個整數,每個整數p在1到5之間,表示要購入的票數,相鄰的兩個數之間使用一個空格分隔。 輸出格式 輸出n行,每行對應一條指令的處理結果。 樣例輸入 4 樣例輸出 1 2 樣例說明 1) 購2張票,得到座位1、2。 評測用例規模與約定 對於所有評測用例,1 ≤ n ≤ 100,所有購票數量之和不超過100。 |
package buyTrainTicket; import java.util.Scanner; import java.util.TreeSet; import java.util.Vector; public class Main { static int seat[] = new int[20];// 記錄每排所剩座位數目 static Vector<TreeSet<Integer>> result = new Vector<>();// 儲存總分配結果 @SuppressWarnings("resource") public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt();// 指令數 for (int i = 0; i < 20; i++) seat[i] = 5;// 初始值為每排五個空座位 for (int i = 0; i < n; i++) { distr(sc.nextInt());// 購買車票數量 } for (TreeSet<Integer> a : result) { for (int b : a) System.out.print(b + " "); System.out.println(); } } public static void distr(int tickets)// 傳參:購票數量 { TreeSet<Integer> ts = new TreeSet<>();// 儲存當前指令的分配結果 for (int i = 0; i < 20; i++)// 優先考慮連坐 { if (seat[i] >= tickets) { for (int t = 0; t < tickets; t++) ts.add(5 * (i + 1) - seat[i] + t + 1); // 儲存分配結果:分配的座位號=本排最後一個座位號-本排空座位數+1 seat[i] -= tickets; result.add(ts);// 當前分配結果記入分配結果總集 return; } } for (int i = 0; i < 20; i++)// 不存在連坐情況 { if (seat[i] > 0) { int min = seat[i] > tickets ? tickets : seat[i]; for (int t = 0; t < min; t++) ts.add(5 * (i + 1) - seat[i] + 1 + t); seat[i] -= min; tickets -= min; if (tickets == 0) { result.add(ts);// 當前分配結果記入分配結果總集 return; } } } } }