[题解]P4053 [JSOI2007] 建筑抢修
首先按 \(t_2\)(截止时间)递增来抢修一定不劣,所以我们按 \(t_2\) 从小到大排序,这样抢修的顺序就确定了。
遍历每个建筑,若能在其 deadline 内修完就修,否则必定要报废当前建筑,或者之前修过的建筑之一。
显然,报废耗时最长的建筑是最优的,用一个堆来维护即可。
点击查看代码
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1.5e5+5;
struct Nd{int t,l;}a[N];
int n,t,ans;
priority_queue<int> q;
signed main(){
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i].t>>a[i].l;
sort(a+1,a+1+n,[](Nd a,Nd b){return a.l<b.l;});
for(int i=1;i<=n;i++){
t+=a[i].t;
q.push(a[i].t);
if(t<=a[i].l) ans++;
else t-=q.top(),q.pop();
}
cout<<ans<<"\n";
return 0;
}
浙公网安备 33010602011771号