加工廠內有 $N$ 台機器。今天工廠收到了 $M$ 筆訂單,訂單編號 $i$ 依序為 $1 \sim M$。每一筆訂單都有 $Q_i$ 道加工程序(簡稱工序),第 $i$ 筆訂單中的第 $j$ 道工序 $T_{ij}$ 可以用 $(k_{ij}, t_{ij})$ 表示,代表要透過指定的 $k_{ij}$ 號機器花費特定時間 $t_{ij}$ 加工。同一個訂單中的工序必須按輸入順序進行處理。每台機器同一時間只能處理一道工序。
為了要有效率又公平地完成這些訂單,我們將用下列方法來決定每一回合要做的工序,直到所有的工序都被做完為止:
每一回合決定時,我們先考慮每筆訂單目前尚未完成的第一道工序,並挑選預計完成時間最早的那道工序進行加工。若有多個工作預計完成時間並列最早,則從中挑選訂單編號較小的工序。
請你根據輸入的訂單資訊,計算出每一筆訂單的完成時間。
以範例輸入為例:(請參照下方動畫觀看)
所有訂單中第一個未處理的工序是 $T_{11}$ 、$T_{21}$ 和 $T_{31}$。由於所有機器在時間 $0$ 都可用,而且一個訂單只有在到達後才能開始,因此這些工序的完成時間分別為 $(0 + 3)$ 、$(0 + 4)$ 和 $(5 + 2)$。$T_{11}$ 具有最早的完成時間,因此我們首先安排處理 $T_{11}$。
當 $T_{11}$ 被排定後,我們需要考慮的工序是 $T_{12}$、$T_{21}$ 和 $T_{31}$。由於同一個訂單中的工序必須按順序進行處理,因此 $T_{12}$ 需要等待 $T_{11}$ 完成後才能開始,$T_{12}$ 的完成時間為 $(3 + 2)$ 。$T_{21}$ 和 $T_{31}$ 的完成時間保持不變。由於 $T_{21}$ 具有最早的完成時間,因此我們安排處理 $T_{21}$ 為下一個工序。
接下來我們需要考慮的工序是 $T_{12}$、$T_{22}$ 和 $T_{31}$。由於一台機器同一時間只能處理一個工序,$T_{12}$ 需要等待機器C 上的 $T_{21}$ 完成後才能開始。因此,$T_{12}$、$T_{22}$ 和 $T_{31}$ 的完成時間分別為 $(4 + 2)$、$(4 + 3)$ 和 $(5 + 2)$ ,因此我們安排處理 $T_{12}$ 為下一個工序。
接下來我們需要考慮的工序是 $T_{22}$ 和 $T_{31}$ 。由於這兩個工序的完成時間相同,我們根據它們所屬的訂單安排處理訂單編號較小的 $T_{22}$ 為下一個工序。
接下來我們需要考慮的工序是 $T_{23}$ 和 $T_{31}$。$T_{23}$ 和 $T_{31}$ 的完成時間分別為 $(7 + 2)$ 和 $(5 + 2)$ ,因此我們安排處理 $T_{31}$。
現在只剩下一個工序 $T_{23}$,它的完成時間為 $(7 + 2)$。
第一行輸入機器的數量 $N$ 與 訂單的數量 $M$。
接下來有 $2M$ 行,每兩行為一組:
第一行輸入該筆訂單的下單時間 $P_i$ 與工序數量 $Q_i$
第二行輸入 $2 \times Q_i$ 個數字,每兩個數字一組,依序輸入每道工序 $T_{ij}$ 執行的機器 $k$ 與所花費時間 $t$ ,機器的變號從 $0 \sim (N-1)$。
測資範圍如下:
輸出共有 $M$ 行,第 $i$ 行輸出第 $i$ 筆訂單完成的時間。保證所有工作完成時間不超過 $10^6$
3 3 0 2 0 3 2 2 0 3 2 4 1 3 2 2 5 1 0 2
6 9 7
1. 如果用 Python 寫的人,可以在送出解答時程式語言選擇 PYPY ,速度比較快。(測試執行不得選擇PYPY)
2. 以下為解題提示,如果沒有想法的可以參考
要解決這個問題,您需要記住以下狀態。首先,您需要記住所有訂單的就緒時間,以及您已完成的工序數量,以便您知道下一個工序是什麼。此外,您還需要記住所有機器的就緒時間,以便您可以計算在這台機器上運行的工序的完成時間。在選擇在機器上運行工序後,您需要更新有關訂單和機器的信息。
ID | User | Problem | Subject | Hit | Post Date |
沒有發現任何「解題報告」 |