貪心 優先佇列 模擬 任務排程器

2022-08-11 08:27:11 字數 1372 閱讀 2024

2020-03-10 17:22:21

問題描述:

給定乙個用字元陣列表示的 cpu 需要執行的任務列表。其中包含使用大寫的 a - z 字母表示的26 種不同種類的任務。任務可以以任意順序執行,並且每個任務都可以在 1 個單位時間內執行完。cpu 在任何乙個單位時間內都可以執行乙個任務,或者在待命狀態。

然而,兩個相同種類的任務之間必須有長度為 n 的冷卻時間,因此至少有連續 n 個單位時間內 cpu 在執行不同的任務,或者在待命狀態。

你需要計算完成所有任務所需要的最短時間。

示例 1:

輸入: tasks = ["a","a","a","b","b","b"], n = 2

輸出: 8

執行順序: a -> b -> (待命) -> a -> b -> (待命) -> a -> b.

注:

任務的總個數為 [1, 10000]。

n 的取值範圍為 [0, 100]。

問題求解:

解法一:貪心

從資料規模可以看出時間複雜度應該是o(n) / o(nlogn)。很容易想到的是要先將頻率計算出來,並且按照頻率進行排序,頻率最高的字元至少會占用(freq_max - 1) * (n + 1) + 1個時間週期。

如果有k個頻率均為最高,那麼上述的公式就變成了(freq_max - 1) * (n + 1) + k,在這種情況下,低頻率的字元完全放入了中間的空當中,甚至還會有盈餘。

那麼還有一種情況就是,中間的空檔並不夠放置所有剩餘的字元,那麼此時最終的解就是len(tasks),因為剩餘的字元可以任意的插入不同slot的末尾,並且保證空閒是足夠的。

演算法時間複雜度:o(nlogn)

public int leastinterval(char tasks, int k)

解法二:優先佇列

本題除了上述的貪心解法,還可以使用優先佇列去模擬結果,使用優先佇列的解更加直觀。我們每次從佇列中取k + 1個最多的任務去做,全部任務都執行完成即可。

時間複雜度:o(time) 和最終的任務序列長度有關。

public int leastinterval(char tasks, int k) 

pq.poll();

}res += 1;

if (pq.isempty() && temp.size() == 0) break;

}for (integer i : temp) pq.add(i);

}return res;

}

codeup 優先佇列 問題 A 任務排程

題目描述 讀入任務排程序列,輸出n個任務適合的一種排程方式。輸入 輸入包含多組測試資料。每組第一行輸入乙個整數n n 100000 表示有n個任務。接下來n行,每行第乙個表示前序任務,括號中的任務為若干個後序任務,表示只有在前序任務完成的情況下,後序任務才能開始。若後序為null則表示無後繼任務。輸...

優先佇列貪心

最近做了幾個用優先佇列進行貪心的題目,這裡寫下來,以免忘了。1 cf 799 b 每次選最便宜的衣服,沒什麼好說的,一發過 include include include include include define n 6005 define inf 0x3f3f3f3f include incl...

貪心 任務排程問題

問題描述 假設給定n個任務的集合t,每個任務i有啟動時間si和完成時間fi si問題分析 要求 在最少的機器上安排完所有任務。如何選擇貪心策略才能使問題的解為最優解?顯然,開始時間最早的任務需要被先執行,但是最優解要求我們使用的機器最少,因此我們每次選擇時應盡量使用相同的機器。若已使用過的機器上現處...