Gym 100247I Meteor Flow(优先队列)

时间:2023-03-09 02:51:03
Gym 100247I	Meteor Flow(优先队列)

https://vjudge.net/problem/Gym-100247I

题意:
有一艘飞船,现在有n颗流星坠落会攻击到飞船,每颗流星会在t时刻降落,对飞船造成d的伤害,飞船会有一个保护盾,初始值为0,每单位时间会+1,受到伤害后保护盾会减去相应的值。飞船上面还有加农炮,发射后可以避免一颗流星的伤害,问在保护盾不受到破坏的情况下(<0)最少需要发射几次加农炮。

思路:

尽量使用加农炮去避免伤害较大的流星。

按照时间顺序将所有流星的伤害值依次放入优先队列,如果到某颗流星时保护盾遭到破坏了,那么就从优先队列中取出之前的伤害最大的流星,此时用加农炮免除它的伤害。

 #include<cstdio>
#include<queue>
using namespace std;
const int maxn = +; int n; priority_queue<int> q; int main()
{
//freopen("in.txt","r",stdin);
scanf("%d",&n);
int pre = ;
int ans = ;
int defend = ;
for(int i=;i<=n;i++)
{
int t,d;
scanf("%d%d",&t,&d);
q.push(d);
defend += t-pre;
pre = t;
while(defend < d)
{
int tmp = q.top(); q.pop();
defend += tmp;
ans++;
}
defend -= d;
}
printf("%d\n",ans);
return ;
}