思路:(可撤销贪心?)先按完成期限对建筑进行升序排序,优先选取完成期限较早的建筑,再用一个堆来维护每个建筑所需的完成时间,如果遍历到所需完成时间比堆顶小(因为此时完成期限为当前建筑中最大的值,此时pop掉堆顶的建筑可能可以让size更大(也就是最终答案))且新的所需时间加和不超过当前建筑完成期限的,则pop原堆顶并push新建筑的所需完成时间即可。

#include <bits/stdc++.h>
using namespace std;

const int Nmax = 2e5;
int n;
long long T_sum;
struct s{
    int d,T;
}a[Nmax];
priority_queue<int,vector<int>,less<int>> heap;
bool comp(s x,s y){    //期限按升序排序
    return x.d < y.d;
}

int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);
    cin>>n;
    for(int i = 1;i <= n;i++)
        cin>>a[i].T>>a[i].d;
    sort(a+1,a+1+n,comp);
    for(int i = 1;i <= n;i++){
        if((T_sum+a[i].T) <= a[i].d){
            heap.push(a[i].T);
            T_sum += a[i].T;
        }
        else{
            if(heap.top() >= a[i].T && (T_sum-heap.top()+a[i].T) <= a[i].d){
                T_sum -= heap.top();
                T_sum += a[i].T;
                heap.pop();
                heap.push(a[i].T);
            }
        }
    }
    cout<<heap.size();
    return 0;
}