Touch The Sky (气球抉择 优先队列)

原题: https://cn.vjudge.net/problem/Gym-101806T

题意:

你的飞艇有n个一次性气球,开始你在海拔0m位置,每一个气球有一个L和D,你在小于等于L的位置才可以使用这个气球,使你的海拔上升D。问我最多可以使用几个气球

解析:

设A=L+D,对于两个气球x和y,他们的A为Ax和Ay。显然当Ax<Ay时,我会优先考虑Ax,因为用完Ax后还可能用Ay,但是用完Ay后一定不能再用Ax。

而且我们还可以反悔,即如果先Ax后,发现不能用了Ay(Ax>Ly),我们得到的结论为,xy中最多只能用一个,那么我们当然会选择其中D小的那个,以增加后面的气球可以被使用的可能性

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=250005;
struct node{
    ll L,D,all;
}e[maxn];
bool cmp(node a,node b){
    return a.all<b.all;
}
int main(){
    int n;
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        scanf("%lld%lld",&e[i].L,&e[i].D);
        e[i].all=e[i].L+e[i].D;
    }
    sort(e+1,e+1+n,cmp);
    ll nowhei=0;
    priority_queue<int> q;
    for(int i=1;i<=n;i++){
        nowhei+=e[i].D;
        q.push(e[i].D);
        if(nowhei>e[i].all){
            int dec=q.top(); q.pop();
            nowhei-=dec;
        }
    }
    printf("%d\n",q.size());
	return 0;
}

猜你喜欢

转载自blog.csdn.net/jk_chen_acmer/article/details/84501467
sky