#include <bits/stdc++.h>
#define int_max 0x3f3f3f3f;
#define long_max 9223372036854775807;
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
typedef pair<double, double> PDD;
typedef unsigned long long ull;
const int MAXN = 1e6;
int n,m;
int main() {
priority_queue<PII,vector<PII>,greater<PII>> pq;
priority_queue<int> r;
cin>>n;
for(int i=1;i<=n;i++){
int x , y;
cin>>x>>y;
pq.push({y,x});
}
ll time = 0;
while(pq.size()){
auto x = pq.top();
pq.pop();
if(time + x.second <= x.first){
time += x.second;
r.push(x.second);
}else{
int k = r.top();
if(x.second < k){
time = time + x.second - k;
r.pop();
r.push(x.second);
}
}
}
cout<<r.size();
}
反悔贪心,将建筑按照临界时间戳排序,另一个作为建筑的“重量” 类似背包把,每个建筑的价值都为1
记录背包的重量,如果能拿上这件物品,就直接拿
如果拿不上,就考虑从背包中拿出最终的物品,然后换上这个新物品,这样背包总重量会变小,但背包中的价值没变,-1 +1