← All problems

1834. Single Threaded CPU

MediumOpen on LeetCodeProblem statement

Problem Statement

1834. Single-Threaded CPU

Medium


You are given n​​​​​​ tasks labeled from 0 to n - 1 represented by a 2D integer array tasks, where tasks[i] = [enqueueTimei, processingTimei] means that the i​​​​​​th​​​​ task will be available to process at enqueueTimei and will take processingTimei to finish processing.

You have a single-threaded CPU that can process at most one task at a time and will act in the following way:

Return the order in which the CPU will process the tasks.

 

Example 1:

Input: tasks = [[1,2],[2,4],[3,2],[4,1]]
Output: [0,2,3,1]
Explanation: The events go as follows: 
- At time = 1, task 0 is available to process. Available tasks = {0}.
- Also at time = 1, the idle CPU starts processing task 0. Available tasks = {}.
- At time = 2, task 1 is available to process. Available tasks = {1}.
- At time = 3, task 2 is available to process. Available tasks = {1, 2}.
- Also at time = 3, the CPU finishes task 0 and starts processing task 2 as it is the shortest. Available tasks = {1}.
- At time = 4, task 3 is available to process. Available tasks = {1, 3}.
- At time = 5, the CPU finishes task 2 and starts processing task 3 as it is the shortest. Available tasks = {1}.
- At time = 6, the CPU finishes task 3 and starts processing task 1. Available tasks = {}.
- At time = 10, the CPU finishes task 1 and becomes idle.

Example 2:

Input: tasks = [[7,10],[7,12],[7,5],[7,4],[7,2]]
Output: [4,3,2,0,1]
Explanation: The events go as follows:
- At time = 7, all the tasks become available. Available tasks = {0,1,2,3,4}.
- Also at time = 7, the idle CPU starts processing task 4. Available tasks = {0,1,2,3}.
- At time = 9, the CPU finishes task 4 and starts processing task 3. Available tasks = {0,1,2}.
- At time = 13, the CPU finishes task 3 and starts processing task 2. Available tasks = {0,1}.
- At time = 18, the CPU finishes task 2 and starts processing task 0. Available tasks = {1}.
- At time = 28, the CPU finishes task 0 and starts processing task 1. Available tasks = {}.
- At time = 40, the CPU finishes task 1 and becomes idle.

 

Constraints:

C++

Source file
class Solution {
public:
    vector<int> getOrder(vector<vector<int>>& tasks) {
        for(int i=0; i<tasks.size(); i++)
            tasks[i].push_back(i);  // emplace idx to keep PIDs intact
        sort(tasks.begin(), tasks.end());
        priority_queue <vector<int>, vector<vector<int>>, greater<vector<int>> > pq;    // burst times
        vector<int> res;
        long i=0, t=0, next_at=tasks[0][0];   // t = time elapsed
        while(i<tasks.size()){
            if(t<next_at){
                if(pq.empty())
                    t=next_at;  // next arrival time
                else{
                    t+=pq.top()[0];
                    res.push_back(pq.top()[1]);
                    pq.pop();
                }
            }
            while(t>=next_at){
                pq.push({tasks[i][1],tasks[i][2]});
                i++;
                if(i==tasks.size())
                    break;
                next_at = tasks[i][0];
            }
        }
        while(!pq.empty()){
            t+=(long)pq.top()[1];
            res.push_back(pq.top()[1]);
            pq.pop();
        }
        return res;
    }
};