【堆】剑与魔法(dragons)

D e s c r i p t i o n Description Description

万老师听说某大国很流行穿越,于是他就想写一个关于穿越的剧本。
闲话休提。话说老师穿越到了某一个剑与魔法的大陆。因为如此这般,所以老师从维娜艾那里得到了预言。老师一共被告知了若干件按顺序结算的事件。这些事件分为两类:战役事件(CASE)、穿越回去事件(END)。战役事件可以选择是否参加,参加了之后会获得一定的金钱。每个END事件发生需要至少参加一定数量的战役事件。特别的是,END事件如果满足要求就会强制发生。老师希望在大陆玩个够,所以他要求只有最后一个END事件会发生。老师希望获得最多的金钱,所以求助于你。

I n p u t Input Input

第一行一个数N,表示输入文件有多少行。

O u t p u t Output Output

接下来每一行用空格隔开一个字符和一个整数。字符为“c”表示战役事件,接下来的整数表示这次涨RP顺带有多少钱;字符为“e”表示穿越回去事件,接下来的整数代表至少要涨多少RP。最后一个事件保证是END事件。

S a m p l e Sample Sample I n p u t Input Input

第一行一个整数,最多金钱数目。

S a m p l e Sample Sample O u t p u t Output Output

若不可能则输出-1。

H i n t Hint Hint

30%的数据满足 N<=20
60%的数据满足 N<=1,000
100%的数据满足 N<=200,000
每次涨RP事件赏金不超过10,000
穿越事件的要求不超过200,000

T r a i n Train Train o f of of T h o u g h t Thought Thought

因为它对赏金没有任何要求
所以肯定是拿最大的赏金

就用一个小根堆
将所有赏金装进去
然后当有穿越的时候
再把小根堆的堆顶弹出
直到赏金的份数少于穿越的要求
这样我们在这一段拿的赏金就是最多的

最后一次穿越的时候判断一下就好了

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue> 
using namespace std;

priority_queue<int, vector<int>, greater<int> >hy;//小根堆
//priority_queue<int>hy;
int n, k, Ans;
char c;

char read()
{
    
    
	char c = getchar();
	while(c != 'c' && c != 'e')c = getchar();
	return c;
}

int main()
{
    
    
	scanf("%d", &n);
	for(int i = 1; i < n; ++i)
	{
    
    
		c = read();
		scanf("%d", &k);
		if(c == 'c')hy.push(k);//插入小根堆
		else if(c == 'e')while(hy.size() >= k)hy.pop();//使赏金的份数少于穿越的要求
	}
	c = read();
	scanf("%d", &k);
	if(hy.size() < k)//若最后一次无法穿越
	{
    
    
		printf("-1");
		return 0;
	}
	while(hy.size())Ans += hy.top(), hy.pop();//将所有赏金加起来
	printf("%d", Ans);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/SSL_wujiajie/article/details/108549434