1. 程式人生 > 實用技巧 >621. 任務排程器 C++怪操作

621. 任務排程器 C++怪操作

給你一個用字元陣列tasks 表示的 CPU 需要執行的任務列表。其中每個字母表示一種不同種類的任務。任務可以以任意順序執行,並且每個任務都可以在 1 個單位時間內執行完。在任何一個單位時間,CPU 可以完成一個任務,或者處於待命狀態。

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

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

示例 1:

輸入:tasks = ["A","A","A","B","B","B"], n = 2
輸出:8
解釋:A -> B -> (待命) -> A -> B -> (待命) -> A -> B
在本示例中,兩個相同型別任務之間必須間隔長度為 n = 2 的冷卻時間,而執行一個任務只需要一個單位時間,所以中間出現了(待命)狀態。
示例 2:

輸入:tasks = ["A","A","A","B","B","B"], n = 0
輸出:6
解釋:在這種情況下,任何大小為 6 的排列都可以滿足要求,因為 n = 0
["A","A","A","B","B","B"]
["A","B","A","B","A","B"]
["B","B","B","A","A","A"]
...
諸如此類
示例 3:

輸入:tasks = ["A","A","A","A","A","A","B","C","D","E","F","G"], n = 2
輸出:16
解釋:一種可能的解決方案是:
A -> B -> C -> A -> D -> E -> A -> F -> G -> A -> (待命) -> (待命) -> A -> (待命) -> (待命) -> A

提示:

1 <= task.length <= 104
tasks[i] 是大寫英文字母
n 的取值範圍為 [0, 100]

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/problems/task-scheduler
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

class Solution {
public:
    int leastInterval(vector<char>& tasks, int n) {
        unordered_map <char, int> mp;
        for (char task : tasks) {
            mp[task]++;
        }
        
        int maxExec = max_element(mp.begin(), mp.end(), [](auto u, auto v) {
            return u.second < v.second;
        })->second;
        
        int maxCount = accumulate(mp.begin(), mp.end(), 0, [=](int acc, auto u) {
            return acc + (u.second == maxExec);
        });

        return max( (maxExec - 1) * (n + 1) + maxCount, static_cast<int>(tasks.size()));
    }
};