原题: 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;
}