洛谷 P4053 [JSOI2007]建筑抢修

题目传送门

反悔的贪心,先按照结束时间从小到大排序,往后扫.

如果能完成当前任务,就更新最后时刻,答案加1.

如果不能完成当前任务,就找在此之前可以完成的用的时间最多的那一个,比较一下,如果当前的这个任务时间更优,就把找到的那个任务删了,换成当前任务,更新最后时刻.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>

using namespace std;

int n,ans;
long long k,sum[150001];
struct kkk{
	long long l,r,st;
}e[150001];
priority_queue<kkk> q;

inline bool operator <(kkk s,kkk d) {
	return s.l < d.l;
}

inline bool cmp(kkk s,kkk d) {
	if(s.r == d.r) return s.l > d.l;
	return s.r < d.r;
}

int main() {
	scanf("%d",&n);
	for(int i = 1;i <= n; i++) {
		scanf("%lld%lld",&e[i].l,&e[i].r);
		e[i].st = e[i].r - e[i].l;
	}
	sort(e+1,e+n+1,cmp);
	for(int i = 1;i <= n; i++) {
		if(e[i].st >= k) {
			k = k + e[i].l;
			ans++;
			q.push(e[i]);
		}
		else {
			kkk o = q.top();
			if(o.l > e[i].l) {
				k = k - o.l + e[i].l;
				q.pop();
				q.push(e[i]);
			}
		}
	}
	printf("%d",ans);
	return 0;
}
原文地址:https://www.cnblogs.com/lipeiyi520/p/13887561.html