1. 程式人生 > >CCF201609 火車購票(JAVA)

CCF201609 火車購票(JAVA)

 

描述:

問題描述

  請實現一個鐵路購票系統的簡單座位分配演算法,來處理一節車廂的座位分配。
  假設一節車廂有20排、每一排5個座位。為方便起見,我們用1到100來給所有的座位編號,第一排是1到5號,第二排是6到10號,依次類推,第20排是96到100號。
  購票時,一個人可能購一張或多張票,最多不超過5張。如果這幾張票可以安排在同一排編號相鄰的座位,則應該安排在編號最小的相鄰座位。否則應該安排在編號最小的幾個空座位中(不考慮是否相鄰)。
  假設初始時車票全部未被購買,現在給了一些購票指令,請你處理這些指令。

輸入格式

  輸入的第一行包含一個整數n

,表示購票指令的數量。
  第二行包含n個整數,每個整數p在1到5之間,表示要購入的票數,相鄰的兩個數之間使用一個空格分隔。

輸出格式

  輸出n行,每行對應一條指令的處理結果。
  對於購票指令p,輸出p張車票的編號,按從小到大排序。

樣例輸入

4
2 5 4 2

樣例輸出

1 2
6 7 8 9 10
11 12 13 14
3 4

樣例說明

  1) 購2張票,得到座位1、2。
  2) 購5張票,得到座位6至10。
  3) 購4張票,得到座位11至14。
  4) 購2張票,得到座位3、4。

評測用例規模與約定

  對於所有評測用例,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;
				}
			}
		}
	}

}