贪心思想,每次选结束时间最早的,假设修了m个房子花了t时间,t比第m个房子的最晚结束时间要大,那么此时,我们就删除之前修过的房子当中需要花的时间最长的那个。 在这个过程中用一个变量记录修了多少房子

#include <iostream>
#include <queue>
#include <algorithm>
using namespace std;
struct node {
    long long time;
    long long final;
};
const int maxn = 150010;
node arr[maxn];
priority_queue<long long, vector<long long>, less<long long>>q;
bool cmp(node a, node b) {
    return a.final < b.final;
}
int main()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        cin >> arr[i].time >> arr[i].final;
    }
    sort(arr + 1, arr + n + 1,cmp);
   long long ans = 0;
   int res = 0;
    for (int i = 1; i <= n; i++) {
        ans += arr[i].time;
        q.push(arr[i].time);
        while (ans > arr[i].final) {
            ans -= q.top();
            q.pop();
            res--;
        }
        res++;
    }
    cout << res;

}