任務排程器演算法(leetcode621)

2021-10-02 00:04:26 字數 1700 閱讀 1902

題目描述如下:

思路:

要想完成任務的時間最短,那麼必須優先處理出現次數最多的任務(如果將次數多的任務留到最後,必然在每次任務之間留出大量的等待時間),因此我們可以以n+1個任務為一輪(保證同一種任務不出現在同一輪),每一輪按出現次數順序從大到小執行,每完成一輪就重新排序依次,直到所有任務完成;

例如:aaabbbbc n=2

首先統計任務次數,然後排序得到 4 3 1

初始time=0

每一輪任務個數為3

第一輪:從次數為4的任務開始,執行一次++time ,然後3執行依次,++time, 然後1執行依次,++time;

完成後再排序有 3 2

第二輪:次數為3的任務執行一次,++time, 次數為2的任務執行一次,++time,本輪找不到剩下可執行的任務,此時需等待乙個單位時間,++time

完成後再排序有 2 1

第三輪:*依次類推。。。++time ,++time,++time(等待)

完成後再排序有 1

第四輪:++time (所有任務完成,不需要另外等待兩個單位時間)

最後time=10

以上思路轉換為**如下:

方法一:

class

solution

++time;

++i;

} i=0;

sort

(count.

begin()

,count.

end())

;}return time;}}

;

class

solution

++i;

++time;

if(pr.

empty()

&&temp.

size()

==0)break;}

for(

auto c:temp)

pr.push

(c);

}return time;}}

;

方法三:仔細分析整個過程發現,完成任務的時間取決與出現次數最多的那個任務

例如:aaabbc n=2

a出現次數最多,我可以直接安排好a為 axxaxxa, 中間的x可以表示執行其他任務或者等待,直接計算完成任務時間為(3-1)*(2+1)+1

在例如aaabbbcc n=2

這時候a和b出現次數都是最大,安排為axxaxxab,完成任務時間為(3-1)(2+1)+2

那麼我們可以總結出乙個公式:time=(maxcnt-1)(n+1)+cnt,其中maxcnt表示任務出現最多的次數,n表示冷卻時間,cnt表示出現了maxcnt次的任務有多少個

最後有特例,比如當n=0時按公式計算結果小於tasks陣列長度,這時候直接取陣列長度即可

**如下:

class

solution

};

leetcode 任務排程器

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

leetcode 任務排程器 python3

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

任務排程器

leetcode621 解題思路一 排序 規定n 1個任務為一輪,保證同一輪中乙個任務最多只能被安排一次。在每一輪中,將當前的任務按照它們剩餘的次數降序排序,並選擇剩餘次數最多的n 1個任務依次執行。如果任務的中種類t n 1,則只能選擇全部的t種任務,其餘時間空閒。也就是利用貪心,因為冷卻時間的存...