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; }