1834. 单线程 CPU

112 阅读1分钟
class Solution {
public:
    struct Task {
        int id;
        long start_time;
        int duration;
    };

    struct cmp_by_start_time {
        bool operator() (Task &a, Task &b) {
            return a.start_time > b.start_time;
        }
    };

    struct cmp_by_duration_id {
        bool operator() (Task &a, Task &b) {
            return a.duration != b.duration ? a.duration > b.duration : a.id > b.id;
        }
    };


    vector<int> getOrder(vector<vector<int>>& tasks) {
        priority_queue<Task, vector<Task>, cmp_by_start_time> candidate_tasks;
        priority_queue<Task, vector<Task>, cmp_by_duration_id> ready_tasks;

        for(int i = 0; i < tasks.size(); i ++) 
            candidate_tasks.push(Task{i, tasks[i][0], tasks[i][1]});

        long cur_time = 0;
        vector<int> res;
        while(res.size() < tasks.size()) {
            if(ready_tasks.empty())
                cur_time = max(cur_time, candidate_tasks.top().start_time);

            while(!candidate_tasks.empty() && candidate_tasks.top().start_time <= cur_time) {
                ready_tasks.push(candidate_tasks.top());
                candidate_tasks.pop();
            }
            Task task_to_process = ready_tasks.top(); //去除当前需要处理的task
            ready_tasks.pop();
            res.push_back(task_to_process.id);
            cur_time += task_to_process.duration; //更新时间
        }
        return res;
    }
};