a137: 加工廠
Tags :
Accepted rate : 2人/2人 ( 100% ) [非即時]
評分方式:
Tolerant

最近更新 : 2023-04-10 20:15

Content

加工廠內有 $N$ 台機器。今天工廠收到了 $M$ 筆訂單,訂單編號 $i$ 依序為 $1 \sim M$。每一筆訂單都有 $Q_i$ 道加工程序(簡稱工序),第 $i$ 筆訂單中的第 $j$ 道工序 $T_{ij}$ 可以用 $(k, t)$ 表示,代表要透過指定的 $k$ 號機器花費特定時間 $t$ 加工。同一個訂單中的工序必須按輸入順序進行處理。每台機器同一時間只能處理一道工序。

為了要有效率又公平地完成這些訂單,我們將用下列方法來決定每一回合要做的工序,直到所有的工序都被做完為止:

每一回合決定時,我們先考慮每筆訂單目前尚未完成的第一道工序,並挑選預計完成時間最早的那道工序進行加工。若有多個工作預計完成時間並列最早,則從中挑選訂單編號較小的工序。

請你根據輸入的訂單資訊,計算出每一筆訂單的完成時間。

以範例輸入為例:(請參照下方動畫觀看)

  1. 所有訂單中第一個未處理的工序是 $T_{11}$ 、$T_{21}$ 和 $T_{31}$。由於所有機器在時間 $0$ 都可用,而且一個訂單只有在到達後才能開始,因此這些工序的完成時間分別為 $(0 + 3)$ 、$(0 + 4)$ 和 $(5 + 2)$。$T_{11}$ 具有最早的完成時間,因此我們首先安排處理 $T_{11}$。

  2. 當 $T_{11}$ 被排定後,我們需要考慮的工序是 $T_{12}$、$T_{21}$ 和 $T_{31}$。由於同一個訂單中的工序必須按順序進行處理,因此 $T_{12}$ 需要等待 $T_{11}$ 完成後才能開始,$T_{12}$ 的完成時間為 $(3 + 2)$ 。$T_{21}$ 和 $T_{31}$ 的完成時間保持不變。由於 $T_{21}$ 具有最早的完成時間,因此我們安排處理 $T_{21}$ 為下一個工序。

  3. 接下來我們需要考慮的工序是 $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}$ 為下一個工序。

  4. 接下來我們需要考慮的工序是 $T_{22}$ 和 $T_{31}$ 。由於這兩個工序的完成時間相同,我們根據它們所屬的訂單安排處理訂單編號較小的 $T_{22}$ 為下一個工序。

  5. 接下來我們需要考慮的工序是 $T_{23}$ 和 $T_{31}$。$T_{23}$ 和 $T_{31}$ 的完成時間分別為 $(7 + 2)$ 和 $(5 + 2)$ ,因此我們安排處理 $T_{31}$。

  6. 現在只剩下一個工序 $T_{23}$,它的完成時間為 $(7 + 2)$。

             

Input

第一行輸入機器的數量 $N$ 與 訂單的數量 $M$。

接下來有 $2M$ 行,每兩行為一組:
第一行輸入該筆訂單的下單時間 $P_i$ 與工序數量 $Q_i$
第二行輸入 $2 \times Q_i$ 個數字,每兩個數字一組,依序輸入每道工序 $T_{ij}$ 執行的機器 $k$ 與所花費時間 $t$,機器的變號從 $0 \sim (N-1)$。

測資範圍如下:

  • $0<N,M<500$
  • $0 \le P<100$
  • $0<Q<500$
  • $0<t<100$
Output

輸出共有 $M$ 行,第 $i$ 行輸出第 $i$ 筆訂單完成的時間。保證所有工作完成時間不超過 $10^6$

Sample Input #1
3 3
0 2
0 3 2 2
0 3
2 4 1 3 2 2
5 1
0 2
Sample Output #1
6
9
7
測資資訊:
記憶體限制: 512 MB
公開 測資點#0 (10%): 1.0s , <1K
公開 測資點#1 (10%): 1.0s , <1M
公開 測資點#2 (10%): 1.0s , <1K
公開 測資點#3 (10%): 1.0s , <1K
公開 測資點#4 (10%): 1.0s , <1M
公開 測資點#5 (10%): 2.0s , <1M
公開 測資點#6 (10%): 1.0s , <1K
公開 測資點#7 (10%): 1.0s , <1K
公開 測資點#8 (10%): 1.0s , <1M
公開 測資點#9 (10%): 1.0s , <1M
Hint :

1. 如果用 Python 寫的人,可以在送出解答時程式語言選擇 PYPY ,速度比較快。(測試執行不得選擇PYPY)

2. 以下為解題提示,如果沒有想法的可以參考

要解決這個問題,您需要記住以下狀態。首先,您需要記住所有訂單的就緒時間,以及您已完成的工序數量,以便您知道下一個工序是什麼。此外,您還需要記住所有機器的就緒時間,以便您可以計算在這台機器上運行的工序的完成時間。在選擇在機器上運行工序後,您需要更新有關訂單和機器的信息。

 

Tags:
出處:
judgegirl [管理者:
ktlai (K.我已霸榜.Tlai)
]


ID User Problem Subject Hit Post Date
沒有發現任何「解題報告」