小企業(yè)想做網(wǎng)站推廣找哪家強網(wǎng)站服務(wù)器ip地址查詢
給你一個二維數(shù)組 tasks ,用于表示 n?????? 項從 0 到 n - 1 編號的任務(wù)。其中 tasks[i] = [enqueueTimei, processingTimei] 意味著第 i?????????? 項任務(wù)將會于 enqueueTimei 時進入任務(wù)隊列,需要 processingTimei 的時長完成執(zhí)行。
現(xiàn)有一個單線程 CPU ,同一時間只能執(zhí)行 最多一項 任務(wù),該 CPU 將會按照下述方式運行:
如果 CPU 空閑,且任務(wù)隊列中沒有需要執(zhí)行的任務(wù),則 CPU 保持空閑狀態(tài)。
如果 CPU 空閑,但任務(wù)隊列中有需要執(zhí)行的任務(wù),則 CPU 將會選擇 執(zhí)行時間最短 的任務(wù)開始執(zhí)行。如果多個任務(wù)具有同樣的最短執(zhí)行時間,則選擇下標(biāo)最小的任務(wù)開始執(zhí)行。
一旦某項任務(wù)開始執(zhí)行,CPU 在 執(zhí)行完整個任務(wù) 前都不會停止。
CPU 可以在完成一項任務(wù)后,立即開始執(zhí)行一項新任務(wù)。
返回 CPU 處理任務(wù)的順序。
示例 1:
輸入:tasks = [[1,2],[2,4],[3,2],[4,1]]
輸出:[0,2,3,1]
解釋:事件按下述流程運行:
- time = 1 ,任務(wù) 0 進入任務(wù)隊列,可執(zhí)行任務(wù)項 = {0}
- 同樣在 time = 1 ,空閑狀態(tài)的 CPU 開始執(zhí)行任務(wù) 0 ,可執(zhí)行任務(wù)項 = {}
- time = 2 ,任務(wù) 1 進入任務(wù)隊列,可執(zhí)行任務(wù)項 = {1}
- time = 3 ,任務(wù) 2 進入任務(wù)隊列,可執(zhí)行任務(wù)項 = {1, 2}
- 同樣在 time = 3 ,CPU 完成任務(wù) 0 并開始執(zhí)行隊列中用時最短的任務(wù) 2 ,可執(zhí)行任務(wù)項 = {1}
- time = 4 ,任務(wù) 3 進入任務(wù)隊列,可執(zhí)行任務(wù)項 = {1, 3}
- time = 5 ,CPU 完成任務(wù) 2 并開始執(zhí)行隊列中用時最短的任務(wù) 3 ,可執(zhí)行任務(wù)項 = {1}
- time = 6 ,CPU 完成任務(wù) 3 并開始執(zhí)行任務(wù) 1 ,可執(zhí)行任務(wù)項 = {}
- time = 10 ,CPU 完成任務(wù) 1 并進入空閑狀態(tài)
示例 2:
輸入:tasks = [[7,10],[7,12],[7,5],[7,4],[7,2]]
輸出:[4,3,2,0,1]
解釋:事件按下述流程運行:
- time = 7 ,所有任務(wù)同時進入任務(wù)隊列,可執(zhí)行任務(wù)項 = {0,1,2,3,4}
- 同樣在 time = 7 ,空閑狀態(tài)的 CPU 開始執(zhí)行任務(wù) 4 ,可執(zhí)行任務(wù)項 = {0,1,2,3}
- time = 9 ,CPU 完成任務(wù) 4 并開始執(zhí)行任務(wù) 3 ,可執(zhí)行任務(wù)項 = {0,1,2}
- time = 13 ,CPU 完成任務(wù) 3 并開始執(zhí)行任務(wù) 2 ,可執(zhí)行任務(wù)項 = {0,1}
- time = 18 ,CPU 完成任務(wù) 2 并開始執(zhí)行任務(wù) 0 ,可執(zhí)行任務(wù)項 = {1}
- time = 28 ,CPU 完成任務(wù) 0 并開始執(zhí)行任務(wù) 1 ,可執(zhí)行任務(wù)項 = {}
- time = 40 ,CPU 完成任務(wù) 1 并進入空閑狀態(tài)
小根堆
class Solution {
public:vector<int> getOrder(vector<vector<int>>& tasks) {priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> q;int n = tasks.size();vector<int> indices(n);iota(indices.begin(), indices.end(), 0);sort(indices.begin(), indices.end(), [&](int i, int j) {return tasks[i][0] < tasks[j][0];});vector<int> ans;long long t = 0;int p = 0;for(int i = 0; i < n; i++){if(q.empty()){t = max(t, (long long)tasks[indices[p]][0]);}while(p < n && tasks[indices[p]][0] <= t){q.emplace(tasks[indices[p]][1], indices[p]);p++;}auto&& [process, index] = q.top();t += process;ans.push_back(index);q.pop();}return ans;}
};
這道題我們需要理清順序,我們需要有一個時間軸,然后將時間軸上的任務(wù)加到任務(wù)列表tasks中。當(dāng)cpu處理任務(wù)的時候,可以認(rèn)為中間不進行任何操作,當(dāng)處理完后,時間軸來到了t,那么就要將時間小于t的所有任務(wù)加入到q中,然后我們q的隊頭就是執(zhí)行時間最短的任務(wù),將它丟到cpu中執(zhí)行。
由于我們不是每個時間都有任務(wù),所以我們定義一個indices數(shù)組,用來對tasks的任務(wù)的開始時間進行索引排序,使得indices內(nèi)tasks任務(wù)的索引順序是根據(jù)其開始時間進行升序排序。那么當(dāng)我們q中沒有任務(wù)的時候我們需要找到下一個任務(wù)的開始時間,那么可以直接使時間軸的時間 t = max(t, (long long)tasks[indices[p]][0]);
。因為我們每次循環(huán)會使cpu執(zhí)行一次任務(wù),那么我們最外層循環(huán)n次即可。