zoukankan      html  css  js  c++  java
  • [luogu4053 JSOI2007] 建筑抢修 (贪心 优先队列)

    传送门

    题目描述

    小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者。但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会完全毁坏。现在的情况是:T部落基地里只有一个修理工人,虽然他能瞬间到达任何一个建筑,但是修复每个建筑都需要一定的时间。同时,修理工人修理完一个建筑才能修理下一个建筑,不能同时修理多个建筑。如果某个建筑在一段时间之内没有完全修理完毕,这个建筑就报废了。你的任务是帮小刚合理的制订一个修理顺序,以抢修尽可能多的建筑。

    输入输出格式

    输入格式:

    第一行是一个整数N,接下来N行每行两个整数T1,T2描述一个建筑:修理这个建筑需要T1秒,如果在T2秒之内还没有修理完成,这个建筑就报废了。

    输出格式:

    输出一个整数S,表示最多可以抢修S个建筑.

    输入输出样例

    输入样例#1:

    4
    100 200
    200 1300
    1000 1250
    2000 3200

    输出样例#1:

    3

    说明

    N < 150,000; T1 < T2 < maxlongint

    题解

    光按t2贪心显然不行,那么应该考虑解决贪心失败的情况
    显然是涉及了t1的问题——让一个t1更小进去显然更优(同样的维修数用时更少)
    那么用个优先队列记录前面的最大t1值当当前t2进行不下去且当前t1小于之前的最大的就把这个t1换进去
    然后跑完就好啦(~ ̄▽ ̄)~

    code:

    //By Menteur_Hxy
    #include<cstdio>
    #include<iostream>
    #include<cstring>
    #include<algorithm>
    #include<cmath>
    #include<queue> 
    #define LL long long
    using namespace std;
    
    const int N=150010;
    int n;
    
    struct blo{
    	LL t1,t2;
    }B[N];
    
    bool cmp(blo a,blo b) {
    	return a.t2<b.t2;
    }
    
    priority_queue<int> Q;
    int main() {
    	scanf("%d",&n);
    	for(int i=1;i<=n;i++) scanf("%lld %lld",&B[i].t1,&B[i].t2);
    	sort(B+1,B+1+n,cmp);
    	LL now=0,ans=0;
    	for(int i=1;i<=n;i++) {
    		if(B[i].t2>=now+B[i].t1) ans++,now+=B[i].t1,Q.push(B[i].t1);
    		else {
    			LL ret=Q.top();
    			if(ret>B[i].t1) {
    				Q.pop();
    				Q.push(B[i].t1);
    				now-=ret-B[i].t1;
    			}
    		}
    	}
    	printf("%lld",ans);
    	return 0;
    }
    
    版权声明:本文为博主原创文章,未经博主允许不得转载。 博主:https://www.cnblogs.com/Menteur-Hxy/
  • 相关阅读:
    定时备份脚本
    NFS+inotify实时同步
    pxe+kickstart自动化安装
    LVS负载均衡DR模式
    Rsync文件同步服务
    NFS文件共享服务
    MySQL-5.5.49安装、多实例、主从复制
    PHP-5.3.27源码安装及nginx-fastcgi配置
    一文解读5G (转)
    一文解读VR/AR/MR (转)
  • 原文地址:https://www.cnblogs.com/Menteur-Hxy/p/9270490.html
Copyright © 2011-2022 走看看