[题解]P4053 [JSOI2007] 建筑抢修

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;
}
posted @ 2025-11-25 12:24  Sinktank  阅读(121)  评论(0)    收藏  举报
★CLICK FOR MORE INFO★ TOP-BOTTOM-THEME
Enable/Disable Transition
Copyright © 2023 ~ 2025 Sinktank - 1328312655@qq.com
Illustration from 稲葉曇『リレイアウター/Relayouter/中继输出者』,by ぬくぬくにぎりめし.