题意
给出NNN个事件,有两种:
ccc xxx战役事件,RP+1RP+1RP+1并加上xxx金钱
eee xxx穿越回去事件,至少要xxx点RPRPRP才能发生
现在我们可以选择一些战役事件,使得得到的金钱最多并只能让最后一件事发生(保证是穿越回去事件),如果不可以输出−1-1−1。
思路
贪心。
当遇到战役事件,把可获得的金钱放到一个小根堆。
当遇到穿越回去事件,就把堆里面的数一直踢掉,直到小于触发这件事的条件(最后一个特殊)。
这个方法保证了每次遇到穿越回去事件时不会触发且每次取的金钱都是最多的,可以保证正确性。
代码
#include<queue>
#include<cstdio>
#include<iostream>
using namespace std;
priority_queue<int> q;
int N, x, ans;
char c;
int main() {
scanf("%d", &N);
for (int i = 1; i <= N; i++) {
cin>>c>>x;
if (c == 'c') q.push(-x);
else while (q.size() >= x && i != N) {
q.pop();
}
}
while (q.size()) {
ans += -q.top();
q.pop();
}
printf("%d", ans);
}