• BZOJ-1029: [JSOI2007]建筑抢修(贪心+堆优化)


    1029: [JSOI2007]建筑抢修

    Time Limit: 4 Sec  Memory Limit: 162 MB
    Submit: 5137  Solved: 2278
    [Submit][Status][Discuss]

    Description

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

    Input

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

    Output

      输出一个整数S,表示最多可以抢修S个建筑.N < 150,000;  T1 < T2 < maxlongint

    Sample Input

    4
    100 200
    200 1300
    1000 1250
    2000 3200

    Sample Output

    3

    HINT

     

    Source

    ps:借鉴题解(这貌似是我除了1001过的最快的一道题了)

    题解:贪心策略比较显然,我们按T2排序,然后从头开始扫,如果能进行抢修,就进行抢修,否则在之前抢修过的建筑中找一个T1最大的,看一下用当前建筑代替它会不会更优。如果是就替换。。求最大值的时候用堆优化一下就好了。。

     1 #include "bits/stdc++.h"
     2 using namespace std;
     3 typedef long long LL;
     4 const int MAX=150005;
     5 int n,ans;
     6 struct Node {
     7     LL x,y;
     8     bool operator <(const Node &tt) const {
     9         return y<tt.y;
    10     }
    11 }stu[MAX];
    12 priority_queue <int> q;
    13 int main(){
    14     freopen ("repair.in","r",stdin);
    15     freopen ("repair.out","w",stdout);
    16     int i,j;
    17     scanf("%d",&n);
    18     for (i=1;i<=n;i++){
    19         scanf("%lld%lld",&stu[i].x,&stu[i].y);
    20     }
    21     sort(stu+1,stu+n+1);
    22     LL now=0;
    23     for (i=1;i<=n;i++){
    24         if (now+stu[i].x<=stu[i].y){
    25             now+=stu[i].x;
    26             ans++;
    27             q.push(stu[i].x);
    28         }
    29         else{
    30             if (!q.size()) continue;
    31             LL zt=q.top();
    32             if (zt>stu[i].x){
    33                 q.pop();
    34                 now-=(zt-stu[i].x);
    35                 q.push(stu[i].x);
    36             }
    37         }
    38     }
    39     printf("%d",ans);
    40     return 0;
    41 }
    未来是什么样,未来会发生什么,谁也不知道。 但是我知道, 起码从今天开始努力, 肯定比从明天开始努力, 要快一天实现梦想。 千里之行,始于足下! ——《那年那兔那些事儿》
  • 相关阅读:
    多项式插值取模哈希标记法
    AC自助机
    [OIBH] 糖果盒(Candy Box)——又一个最大子矩形
    windows phone 之ListBox数据绑定
    WP学习笔记
    为TextArea添加maxlength属性
    让整个网页(LOGO图片)色调全部变灰的方法(CSS写法)
    JS调试加断点
    Container.ItemIndex 获取到行的序号
    c# Invoke 与 BeginInvoke
  • 原文地址:https://www.cnblogs.com/keximeiruguo/p/7484713.html
Copyright © 2020-2023  润新知