版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SSL_hzb/article/details/82632509
题意
给出
个事件,有两种:
战役事件,
并加上
金钱
穿越回去事件,至少要
点
才能发生
现在我们可以选择一些战役事件,使得得到的金钱最多并只能让最后一件事发生(保证是穿越回去事件),如果不可以输出
。
思路
贪心。
当遇到战役事件,把可获得的金钱放到一个小根堆。
当遇到穿越回去事件,就把堆里面的数一直踢掉,直到小于触发这件事的条件(最后一个特殊)。
这个方法保证了每次遇到穿越回去事件时不会触发且每次取的金钱都是最多的,可以保证正确性。
代码
#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);
}