GYM 100247 I. Meteor Flow(贪心)

来源:互联网 发布:php 自动化部署 编辑:程序博客网 时间:2024/06/06 13:04

Description
飞船有一个防护罩,初始耐久度为0,每秒加一单位,给出n次导弹攻击,第i次攻击在第t[i]秒,攻击力d[i],如果防护罩耐久不小于导弹的攻击力则飞船没事,但防护罩耐久会掉d[i],否则gg,但是飞船上有炮,每炮可以毁掉任意导弹,问最少需要多少炮飞船不gg
Input
第一行一整数n表示导弹数量,之后n行每行两个整数t[i],d[i]表示该次攻击的时间和导弹的攻击力,保证t非减
(1<=n<=200000,1<=t[i],d[i]<=1e9)
Output
输出保证飞船安全的情况下大的最少炮数
Sample Input
3
3 2
5 4
6 3
Sample Output
1
Solution
贪心,当前累加伤害值不大于飞船耐久继续往下扫,否则不停拿出之前所有攻击中伤害值最大的用炮打,所以用一个优先队列来维护伤害即可
Code

#include<cstdio>#include<iostream>#include<cstring>#include<algorithm>#include<cmath>#include<vector>#include<queue>#include<map>#include<set>#include<ctime>using namespace std;typedef long long ll;#define INF 0x3f3f3f3f#define maxn 222222int n,t[maxn],d[maxn];priority_queue<int>que;int main(){    while(~scanf("%d",&n))    {        while(!que.empty())que.pop();        for(int i=1;i<=n;i++)scanf("%d%d",&t[i],&d[i]);        ll sum=0;        int ans=0;        for(int i=1;i<=n;i++)        {            que.push(d[i]),sum+=d[i];            while(i<n&&t[i+1]==t[i])i++,que.push(d[i]),sum+=d[i];            while(sum>t[i]&&!que.empty())            {                int now=que.top();                que.pop();                sum-=now;                ans++;            }        }        printf("%d\n",ans);    }    return 0;}
0 0