c++实现带期限作业排序问题
时间: 2023-05-16 18:04:39 浏览: 173
可以使用优先队列来实现带期限作业排序问题。具体实现方法是将作业按照期限从小到大排序,然后将每个作业的期限作为优先级,将作业依次加入优先队列中。当有新的作业加入时,如果当前队列中的作业数量已经超过了期限,则将队列中期限最大的作业删除,然后将新的作业加入队列中。最后,依次输出队列中的作业即可。
以下是示例代码:
```
#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;
struct Job {
int id; // 作业编号
int deadline; // 期限
int profit; // 收益
};
bool cmp(const Job& a, const Job& b) {
return a.deadline < b.deadline;
}
int main() {
int n; // 作业数量
cin >> n;
vector<Job> jobs(n);
for (int i = 0; i < n; i++) {
cin >> jobs[i].id >> jobs[i].deadline >> jobs[i].profit;
}
// 按照期限从小到大排序
sort(jobs.begin(), jobs.end(), cmp);
priority_queue<int, vector<int>, greater<int>> pq; // 小根堆,存储当前最优解
int max_profit = 0;
for (int i = 0; i < n; i++) {
if (pq.size() < jobs[i].deadline) { // 当前队列中的作业数量未超过期限
pq.push(jobs[i].profit);
max_profit += jobs[i].profit;
} else if (pq.top() < jobs[i].profit) { // 当前作业的收益大于队列中最小的收益
max_profit += jobs[i].profit - pq.top();
pq.pop();
pq.push(jobs[i].profit);
}
}
cout << "最大收益:" << max_profit << endl;
return 0;
}
```
该算法的时间复杂度为 O(nlogn),其中 n 为作业数量。
阅读全文