【JSOI】【codevs 2913 建筑抢修】

113人阅读 评论(0) 收藏 举报
分类:

2913 建筑抢修 省队选拔赛江苏
时间限制: 1 s
空间限制: 128000 KB
题目等级 : 大师 Master
题解
查看运行结果
题目描述 Description
小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏: 经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者。但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复的话,这些建筑设施将会完全毁坏。现在的情况是:T部落基地里只有一个修理工人,虽然他能瞬间到达任何一个建筑,但是修复每个建筑都需要一定的时间。同时,修理工人修理完一个建筑才能修理下一个建筑,不能同时修理多个建筑。如果某个建筑在一段时间之内没有完全修理完毕,这个建筑就报废了。你的任务是帮小刚合理的制订一个修理顺序,以抢修尽可能多的建筑。

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

输出描述 Output Description
输出一个整数S,表示最多可以抢修S个建筑。

样例输入 Sample Input
4
100 200
200 1300
1000 1250
2000 3200

样例输出 Sample Output
3

数据范围及提示 Data Size & Hint
N<150000,t<=15000

数据不是原数据,是本人自己出的数据。t的范围也与原题不同。

“抢修尽可能多的建筑” -> 贪心。

策略?
每个建筑有维修用时与死亡时间
按照死亡时间从早到晚排序

为什么?
先救死的早的不一定耽误救死的晚的
先救死的晚的,死的早的都死透了,不优

对于每一个如何选择?
如果当前这个可以救,也就是
当前时刻 + 维修用时 <= 死亡时刻
//对没错 可以等于 从死亡线上拉回来的

如果想救当前这个,但是救完之前就会死掉
即当前时刻 + 维修用时 > 死亡时刻
考虑已经救过的之中,用时最大的那个,
如果救了这个不比救那个代价大,救这个,不救那个
不然才救那个

怎么维护呢
用·堆·呀
大根堆,堆里存维修用时
now是当前时刻
能救的都在堆里,最后答案就是堆中元素个数

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
using namespace std;
const int MAXN = 150005;
#define LL long long
int n;
LL now = 0;
struct edge{
    LL l,r;
}num[MAXN];
//l:维修用时 r:坏掉的时刻
priority_queue < int > q;

bool cmp(edge a,edge b){
    return a.r < b.r;
}

int main(){
    memset(num,0,sizeof(num));
    scanf("%d",&n);
    for(int i = 1; i <= n; i ++)    
        scanf("%lld %lld",&num[i].l,&num[i].r);
    sort(num + 1,num + 1 + n,cmp);
    q.push(num[1].l); now = num[1].l; 
    for(int i = 2; i <= n; i ++){
        if(now + num[i].l > num[i].r){
            if(num[i].l <= q.top())//<=
                now -= q.top(),q.pop(),q.push(num[i].l),now += num[i].l;
        }
        else q.push(num[i].l),now += num[i].l;
    }
    printf("%d\n",q.size());
    return 0;
}
查看评论

【BZOJ1029】【JSOI2007】【建筑抢修】【贪心+堆】

Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者。但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不...
  • sunshinezff
  • sunshinezff
  • 2015-08-14 15:14:57
  • 1401

【codevs 2913】建筑抢修

题目描述 Description 小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏: 经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者。但是T部落的基地里已经有N个建筑设施受到了严重的损伤...
  • Hall_Of_Fame_
  • Hall_Of_Fame_
  • 2017-10-16 16:02:32
  • 73

codevs 2913 建筑抢修

建筑抢修
  • Hawo11
  • Hawo11
  • 2017-07-03 20:29:52
  • 117

bzoj 1029 [JSOI2007] 建筑抢修 题解

【原题】 1029: [JSOI2007]建筑抢修 Time Limit: 4 Sec  Memory Limit: 162 MB Submit: 1869  Solved: 800 [Submi...
  • u013724185
  • u013724185
  • 2014-04-03 15:54:43
  • 1794

bzoj1029 [JSOI2007]建筑抢修

Description   小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的 入侵者。但是T部落的基地里已经有N个建筑设施受到了严重的损伤...
  • qq_21494715
  • qq_21494715
  • 2017-02-10 22:22:36
  • 101

[bzoj 1029--JSOI2007]建筑抢修

有n个点,每个点有两个值(x,y),意为这个点在总共y的时间内用x时间才算成功。问成功的点的数量的最大值。 这道题思路为贪心,我们用一个multiset来记录,这个东东的好处是有很多操作,自动排序,并...
  • lixuanjing2016
  • lixuanjing2016
  • 2016-09-21 13:57:32
  • 613

【JSOI2007】建筑抢修 贪心+堆

Description小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的入侵者。但是T部落的基地里已经有N个建筑设施受到了严重的损伤,如果不尽快修复...
  • LOI_DQS
  • LOI_DQS
  • 2015-10-13 09:17:45
  • 915

codevs 2913 [JSOI2007] 建筑抢修 贪心

GG!
  • qq_36312502
  • qq_36312502
  • 2017-10-16 14:45:59
  • 108

【JSOI 2007】建筑抢修

【题目链接】          点击打开链接【算法】           将T2从小到大排序,当决策当前建筑修或不修时,若当前花费时间 + T1 &amp;lt;= T2,则修,否则判断T1是否小于之...
  • even_bao
  • even_bao
  • 2018-03-03 14:20:14
  • 39
    个人资料
    等级:
    访问量: 7万+
    积分: 2881
    排名: 1万+
    %%%