三道题
总结:写的时候太紧张了,很烦
T1
题目:给出n个任务的最晚完成时间(单位为小时)和对应积分,每小时只能做一个任务,且超时后不获得积分,求出最大的价值和。
解法:排序+堆
先对数组排序,先对最晚完成时间升序排序,再对积分降序排序。
用小根堆存储已经完成的任务的积分,遍历所有任务,当该任务未超时时加入堆,如果超时,比较两个任务的积分,将积分更多的任务加入堆,并且pop。
最后堆里面的就是能拿到积分的任务。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
int main() {
int n;
cin >> n;
vector<pair<ll, ll>> v;
for (int i = 0; i < n; ++i) {
int t1, t2;
cin >> t1 >> t2;
v.push_back({
t1, t2 });
}
sort(v.begin(), v.end(), [&](const auto& lhs, const auto& rhs) {
return lhs.first != rhs.first ? lhs.first < rhs.first : lhs.second > rhs.second;
});
priority_queue<ll, vector<ll>, greater<ll>> pq;
for (const auto& i : v) {
if (i.first > pq.size()) pq.