ETH官方钱包

前往
大廳
主題

LeetCode - 2895. Minimum Processing Time 解題心得

Not In My Back Yard | 2024-12-11 12:00:06 | 巴幣 2 | 人氣 19

題目連結:


題目意譯:
你有特定數量的處理器,每一個處理器有著 4 顆核心。而現在要執行的任務數量為處理器數的四倍。每一個任務必須被指派到單一一個核心來執行,而每一個核心只能被使用一次。

你被給定一個代表著每一個處理器可以開始作動的時間點之陣列 processorTime,以及另一個代表著每一個任務需要耗費的時間之陣列 tasks。回傳完成所有任務的最少所需時間。

限制:
1 ≦ n == processorTime.length ≦ 25000
1 ≦ tasks.length ≦ 10 ^ 5
0 ≦ processorTime[i] ≦ 10 ^ 9
1 ≦ tasks[i] ≦ 10 ^ 9
tasks.length == 4 × n



範例測資:
範例 1:
輸入: processorTime = [8,10], tasks = [2,2,3,1,8,7,4,5]
輸出: 16
解釋:
在時間點 = 8 時將索引值 4 、 5 、 6 、 7 的任務指派到此時剛變為可使用的第一個處理器,並在時間點 = 10 時將索引值 0 、 1 、 2 、 3 的任務指派到此時剛變為可使用的第二個處理器。
第一個處理器完成所有任務所需的時間為 max(8 + 8, 8 + 7, 8 + 4, 8 + 5) = 16。
第二個處理器完成所有任務所需的時間為 max(10 + 2, 10 + 2, 10 + 3, 10 + 1) = 13。

範例 2:
輸入: processorTime = [10,20], tasks = [2,3,1,2,5,8,4,3]
輸出: 23
解釋:
將索引值 1 、 4 、 5 、 6 的任務指派到第一個處理器,並將剩下的任務指派給第二個處理器。
第一個處理器完成所有任務所需的時間為 max(10 + 3, 10 + 5, 10 + 8, 10 + 4) = 18.。
第二個處理器完成所有任務所需的時間為 max(20 + 2, 20 + 1, 20 + 2, 20 + 3) = 23。


解題思維:
總之先把 processorTime 按照小到大排序、tasks 也一樣按照小到大排序(很明顯地,這不會影響答案)。

而我們可以看到每一個處理器完成任務的時間取決於指派到該處理器的四個任務中所需時間最大者。因此可以推得 tasks[0] ~ tasks[3](注意這邊是排序後的 tasks)應指派到同一個處理器、tasks[4] ~ tasks[7] 應指派到同一個處理器……以此類推。

因此我們現在只需要考慮 tasks[3] 、 tasks[7] 等等的任務要分配哪些處理器。



假設現在只有兩個處理器,可用時間點為 p0 、 p1(不失一般性地假設 p0 ≦ p1)、以及兩個任務的所需時間 t0 、 t1(一樣不失一般性地假設 t0 ≦ t1)。則我們只有兩種選項:
    (一)max(p0 + t0, p1 + t1) = p1 + t1。
    (二)max(p0 + t1, p1 + t0)。
(一)沒什麼好說的,p0 ≦ p1 再加上 t0 ≦ t1 使得其值一定是 p1 + t1。

(二)乍看之下決定不了任何關係,但我們實際上可以看到 p0 + t1 ≦ p1 + t1 以及 p1 + t0 ≦ p1 + t1。因此
max(p0 + t1, p1 + t0) ≦ max(p1 + t1, p1 + t1) = p1 + t1
而這代表著(二)實際上是有機會比(一)更小的。

並且上面的結論適用於每兩個處理器以及每兩個任務。也因此可以推得:所需時間最長的任務要指派給可用時間點最早的處理器、所需時間次長的任務要指派給可用時間點次早的處理器、……以此類推。

所以所求即為(令 t = tasks.length)
max(processorTime[0] + tasks[t - 1], processorTime[1] + tasks[t - 5], ……)




此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。

創作回應

更多創作