因为时间是有顺序的,我们可以用结构体存储三个元素,并且将时间作为自定义排序依据进行排序,每个模块对num提供的权值为s-w,,设置一个num作为货柜的可承载重量初始为0,不难想到,当num<0时侯架子就不行了,那么当num<0时必然会有一个绝对值很大并且值为负的s-w,此时我们应该将这个s-w从num中减去,这个就是我们应该删除的,要想找到这个最小的s-w我们可以用优先队列进行维护(本题应该使用大根堆插入s-w,但是代码是比赛时写的,当时插入的是w-s,所以用的是小根堆,其实都一样),最后优先队列中的元素数就是老板买的数目,只需要用n减去队列中的数目就是答案。本题目是一个经典的反悔贪心问题。

#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const int N=2e5+10;
struct Node{
    ll w,s,t;
    bool operator<(const Node&u){
        return t<u.t;
    }
}a[N];

int main(){
    int n;cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i].w>>a[i].s>>a[i].t;
    }
    sort(a+1,a+1+n);
    priority_queue<ll> pq; 
    ll sum = 0; 
    for(int i=1;i<=n;i++){
        sum += a[i].s - a[i].w;
        pq.push(a[i].w - a[i].s);
        while(sum < 0 && !pq.empty()){
            ll x = pq.top();
            pq.pop();
            sum += x; 
        }
    }
    cout << n - pq.size() << '\n';
    return 0;
}