トピック
入力サンプル
4 50 2 10 1 20 2 30 1
7 20 1 2 1 10 3100 2 8 2
5 20 50 10
サンプル出力
80
185
回答
- 小さなルートパイルを使用して、最も収益性の高いコレクションを維持し、すべての製品を貯蔵寿命に応じて小さいものから大きいものへと並べ替えることができます。製品を追加するたびに、コレクション内の製品が満たされているかどうかを判断できます。貯蔵寿命の間に販売されます。そうでない場合は、スタックの一番上から始めます。要素を削除します(ヒープの一番上が最も利益の少ない要素です)
- このようにして、制限を下回るたびに最小の利益が削除され、最大の利益が無期限のコレクションで保証されます。
コード
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
typedef pair<int, int> PII;
const int N = 1e4 + 10;
int main() {
int n;
while (cin >> n) {
PII v[N];
for (int i = 1; i <= n; i++) {
cin >> v[i].second >> v[i].first;
}
sort(v + 1, v + 1 + n);
priority_queue<int, vector<int>, greater<int>> pq;
for (int i = 1; i <= n; i++) {
pq.push(v[i].second);
if(pq.size()>v[i].first){
pq.pop();
}
}
int res=0;
while (pq.size()){
res+=pq.top();
pq.pop();
}
cout<<res<<endl;
}
return 0;
}