Description
翻译: 给定价格 和最晚可以卖掉的时间
,求卖出的最大金额。
Solution1
几年前的老题目了,看了下数据范围,根本不用考虑优化。
对商品按价格从大到小排序,每次选取当前最高价格的,然后从 开始往前找是否有哪一天还没用过,
直接 暴力即可.
PS: 并查集可以优化一下这个过程,懒得写了。
Code1
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const long long inf = 1e18;
const int N = 5e5 + 5, mod = 998244353;
int n;
struct node {
int l, r;
bool operator < (const node &s) {
return l > s.l;
}
}a[N];
bool vis[N];
int main() {
while(cin >> n) {
for(int i = 1; i <= n; i++) {
cin >> a[i].l >> a[i].r;
vis[i] = 0;
}
sort(a + 1, a + 1 + n);
ll ans = 0;
for(int i = 1; i <= n; i++) {
//cout << a[i].l << ' ' << ans << "\n";
for(int j = a[i].r; j >= 1; j--) {
if(!vis[j]) {
vis[j] = 1;
ans += a[i].l;
break;
}
}
}
cout << ans << "\n";
}
return 0;
} Solution2
显然可以优先队列优化,按时间从小到大排序,每次放入一个当前价格最小的,如果能放,直接放进去,否则弹出最小值,放入当前值。
最后答案为优先队列的所有值。
时间复杂度
但是一个 60ms 一个 100ms, 其实差别不大?
Code2
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const long long inf = 1e18;
const int N = 5e5 + 5, mod = 998244353;
int n;
struct node {
int l, r;
bool operator < (const node &s) {
return r < s.r;
}
}a[N];
bool vis[N];
int main() {
while(cin >> n) {
for(int i = 1; i <= n; i++) {
cin >> a[i].l >> a[i].r;
vis[i] = 0;
}
sort(a + 1, a + 1 + n);
priority_queue<int, vector<int>, greater<int> > q;
for(int i = 1; i <= n; i++) {
q.push(a[i].l);
if(q.size() > a[i].r) {
q.pop();
}
}
ll ans = 0;
while(!q.empty()) {
ans += q.top();
q.pop();
}
cout << ans << "\n";
}
return 0;
} 
京公网安备 11010502036488号