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

本文介绍了一种利用贪心算法解决特定指令集问题的方法,通过小根堆管理和优化指令执行顺序,以实现最大价值。具体策略为,对于限制型指令,确保不超过规定次数执行收益型指令;对于收益型指令,优先执行高价值指令。

题目大意:

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

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

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


思路:

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


代码:

#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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值