这道题首先通过排序让截止时间早的尽可能排在前面,然后通过优先队列(降序)q保存抢修的建筑所花费的时间,然后对结构体数组进行遍历,如果现在花费的总时间加上抢修现在这个建筑所需要的时间之和小于等于本建筑的截止时间,那么便对他进行抢修,更新q、t。如果现在花费的总时间加上抢修现在这个建筑所需要的时间之和大于本建筑的截止时间,那么显然这个建筑是不能进行抢修的,但是可以对优先队列q进行优化。因为针对前面选中的抢修的建筑,首先它的截止时间一定在本建筑前面(结构体数组已排序),如果修复本建筑需要的时间比之前选中的建筑的时间要少,那么完全可以以本建筑的修复代替那次修复。所以实行到代码上的具体操作就是先将本建筑修复时间存入到优先队列中,让t先加上修复本建筑的时间,并将其加入到q中,然后用q.top()去更新。
using namespace std;
#define ll long long
struct node{
ll t1, t2;
};
node bui[150010];
bool cmp(node a, node b){
return a.t2 < b.t2;
}
int main(){
int n;
cin >> n;
for(int i = 1; i <= n; i ++){
scanf("%lld%lld", &bui[i].t1, &bui[i].t2);
}
sort(bui + 1, bui + 1 + n, cmp);
long long t = 0;
priority_queue <int> q;
for(int i = 1; i <= n; i ++){
if(t + bui[i].t1 <= bui[i].t2){
q.push(bui[i].t1);
t += bui[i].t1;
}else{
q.push(bui[i].t1);
t += bui[i].t1;
t -= q.top();
q.pop();
}
}
cout << q.size() << endl;
}