题目链接
https://www.luogu.org/problemnew/show/P4053
题解:定义一个结构体,把修楼需要的时间和楼还有多长时间损坏存进去。以损坏时间先后排一下序,优先修快坏的,然后存一个已用时间,再建立一个堆来维护已修的楼用时最大的。如果判断下个楼没时间修了,就把修它需要的时间和已经修的楼中最大的时间比一下谁少。如果当前楼比之前的楼消耗的时间小,那就不修之前最大的楼,改修这个。虽然不会多修楼,但是可以省下更多时间给后面的楼。
#include<cstdio>
#include<cstdlib>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<queue>
#include<stack>
#include<cstring>
#include<string>
using namespace std;
typedef long long LL;
struct MyStruct
{
int spe;
int end;
}build[150005];
priority_queue<int>Q;
int n, t;
int cmp(MyStruct a,MyStruct b){
return a.end < b.end;
}
int main() {
cin >> n;
for (int i = 0; i < n; i++) {
cin >> build[i].spe >> build[i].end;
}
t = 0;
int ans = 0;
sort(build, build + n, cmp);
for (int i = 0; i < n; i++) {
if (t + build[i].spe <= build[i].end) {
Q.push(build[i].spe);
t += build[i].spe;
ans++;
}
else {
if (!Q.empty() && build[i].spe < Q.top()) {
t -= Q.top(); Q.pop();
t += build[i].spe;
Q.push(build[i].spe);
}
}
}
cout << ans;
}