P4053 [JSOI2007]建筑抢修

Miku

贪心

按照时间从前往后尽可能的修

如果能修就修,修不了的话

我们可以选择撤掉一个以前修的腾出时间来,但是,腾出两个显然更蠢

那么,显然无论腾不腾,截止到此建筑,能修的数量最多一定()

由此观之,应该把已修的最大的取出来,然后进行比较,放进小的,扔掉大的,来为后面腾时间

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
priority_queue <long long >q	;
long long n;
struct bu{
	long long ne;
	long long boom;
}buil[150001];
bool cmp(bu x,bu y){
	if(x.boom==y.boom)
	return x.ne<y.ne;
	return x.boom<y.boom;
	
}
long long now;
long long s;
int main(){
	scanf("%lld",&n);
	for(long long i=1;i<=n;++i){
		scanf("%lld%lld",&buil[i].ne,&buil[i].boom);
	}
	sort(buil+1,buil+n+1,cmp);
	for(long long i=1;i<=n;++i){
		if(buil[i].ne+now<=buil[i].boom){
			q.push(buil[i].ne);
			now+=buil[i].ne;
			s++;
			continue;
		}else{
			if(!q.empty()){
				if(q.top()>buil[i].ne){
					now=now+buil[i].ne-q.top();
					q.pop();
					q.push(buil[i].ne);
				}else{
					continue;
				}
			}
		}
	}
	cout<<s;
	return 0;
}

posted @ 2020-08-02 19:33  Simex  阅读(76)  评论(0编辑  收藏  举报