中级农民
- 积分
- 104
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2019-2-12
- 最后登录
- 1970-1-1
|
- #include <iostream>
- #include <vector>
- #include <queue>
- using namespace std;
- class Solution {
- public:
- int fastedTaskSchedule(int N, vector<int>& tasks, vector<vector<int>>& prerequisites, int machines) {
- vector<int> pre_nums(N, 0);
- vector<vector<int>> unlocks(N, vector<int>());
- for (auto pre : prerequisites) {
- pre_nums[pre[1]] ++;
- unlocks[pre[0]].push_back(pre[1]);
- }
-
- vector<int> time_left(N, -1);
- for (int i = 0; i < N; ++i) {
- if (pre_nums[i] == 0) getTimeLeft(i, tasks, unlocks, time_left);
- }
-
- auto cmp_min = [](const pair<int, int>& t1, const pair<int, int>& t2) {
- return t1.second > t2.second;
- };
- auto cmp_max = [](const pair<int, int>& t1, const pair<int, int>& t2) {
- return t1.second < t2.second;
- };
-
- priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp_min)> task_finish(cmp_min);
- priority_queue<pair<int, int>, vector<pair<int, int>>, decltype(cmp_max)> task_ready(cmp_max);
-
- for (int i = 0; i < N; ++i) {
- if (pre_nums[i] == 0) task_ready.push({i, time_left[i]});
- }
-
- int cur_time = 0;
- while (!task_ready.empty() || !task_finish.empty()) {
- while (task_finish.size() < machines && !task_ready.empty()) {
- auto task = task_ready.top();
- task_ready.pop();
- task_finish.push({task.first, cur_time + tasks[task.first]});
- }
-
- auto cur_finish = task_finish.top();
- task_finish.pop();
- cur_time = cur_finish.second;
- int cur = cur_finish.first;
- for (int next : unlocks[cur]) {
- pre_nums[next] --;
- if (pre_nums[next] == 0) task_ready.push({next, time_left[next]});
- }
- }
- return cur_time;
- }
-
- void getTimeLeft(int i, const vector<int>& tasks, const vector<vector<int>>& unlocks, vector<int>& time_left) {
- if (time_left[i] != -1) return;
- time_left[i] = tasks[i];
- int max_next = 0;
- for (int next : unlocks[i]) {
- getTimeLeft(next, tasks, unlocks, time_left);
- max_next = max(max_next, time_left[next]);
- }
- time_left[i] += max_next;
- }
- };
- int main()
- {
- Solution s;
-
- int N = 6;
- vector<int> tasks = {10, 10, 2, 3, 100, 200};
- vector<vector<int>> prerequisites = {{0, 1}, {2, 3}, {4, 5}};
- int machines = 2;
-
- cout << s.fastedTaskSchedule(N, tasks, prerequisites, machines) << endl;
- return 0;
- }
复制代码
|
|