因为时间是有顺序的,我们可以用结构体存储三个元素,并且将时间作为自定义排序依据进行排序,每个模块对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;
}

京公网安备 11010502036488号