题目大意:
题目链接: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;
}

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

被折叠的 条评论
为什么被折叠?



