【JZOJ 3487】剑与魔法【贪心】【堆】

题目大意:

题目链接:https://jzoj.net/senior/#main/show/3487
nn条指令。每个指令有以下两种格式。

  • c xc\ x:若执行该指令,则可以获得xx价值。
  • e xe\ x:在接到这条指令之前不可以执行超过或等于xxcc指令。

在忽略最后一个ee指令的前提下求最大价值。


思路:

居然是贪心。。。
对于每一个ee指令,我们不能执行超过xxcc指令,那么很明显,肯定是要尽量多执行cc指令并且执行价值较大的指令
那么就将读入到的指令放入一个小根堆里,每次当执行的cc指令超过xx条时,就删除小根堆的最小元素,这样就可以保证所得到的价值最大。
然后对于cc指令就直接将元素插入堆即可。


代码:

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

int n,a[200100],sum;
char c;
priority_queue<int> q;

int main()
{
	scanf("%d",&n);
	for (int i=1;i<n;i++)
	{
		cin>>c>>a[i];
		if (c=='c') q.push(-a[i]);  
		//STL原本是大根堆,但是去成相反数之后原本更大的数就会更小,就达到了小根堆的目的。
		else
		 while (q.size()>=a[i]) q.pop();  //e指令,留下最大的x-1个元素
	}
	cin>>c>>a[n];
	if (q.size()<a[n])  //判断最后是否有x个元素
	{
		printf("-1");
		return 0;
	}
	while (q.size())
	{
		sum-=q.top();  //由于取了相反数,所以最后原本是相加,就变成了相减
		q.pop(); 
	}
	printf("%d\n",sum);
	return 0;
}
原文地址:https://www.cnblogs.com/hello-tomorrow/p/11998607.html