• [BZOJ1029][JSOI2007]建筑抢修


    1029: [JSOI2007]建筑抢修

    Time Limit: 4 Sec  Memory Limit: 162 MB
    Submit: 5041  Solved: 2242
    [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
     
     
    这道题采用贪心思想,首先对于所有数的t2排序,随后维护抢修的t1的大根堆,每次寻找堆中最大的看当前t1是否小于它,小于就替换掉。正确性显然。
     1 #include<iostream>
     2 #include<cstring>
     3 #include<cstdio>
     4 #include<cstdlib>
     5 #include<cmath>
     6 #include<algorithm>
     7 #include<queue>
     8 #include<vector>
     9 #define LL long long
    10 using namespace std;
    11 int n;
    12 struct data{int t1,t2;}a[150005];
    13 bool cmp(data c1,data c2){return c1.t2<c2.t2;}
    14 struct cmp1
    15 {
    16     bool operator()(data c1,data c2){return c1.t1<c2.t1;}
    17 };
    18 priority_queue<data,vector<data>,cmp1> q;
    19 int main()
    20 {
    21     scanf("%d",&n);
    22     for(int i=1;i<=n;i++) scanf("%d%d",&a[i].t1,&a[i].t2);
    23     LL sum=0;
    24     int ans=0;
    25     sort(a+1,a+n+1,cmp);
    26     for(int i=1;i<=n;i++)
    27     {
    28         if(a[i].t2>=sum+a[i].t1){q.push(a[i]);ans++;sum+=a[i].t1;}
    29         else
    30         {
    31             if(q.empty()) continue;
    32             data now=q.top();
    33             if(now.t1>a[i].t1)
    34             {
    35                 sum=sum-now.t1+a[i].t1;
    36                 q.pop();
    37                 q.push(a[i]);
    38             }
    39         }
    40     }
    41     printf("%d",ans);
    42 }
    View Code
    O(∩_∩)O~ (*^__^*) 嘻嘻…… O(∩_∩)O哈哈~
  • 相关阅读:
    浅谈命令混淆
    为你解惑之Silverlight经典10问详解 (转载)
    Prism 简介
    Prism学习笔记(二)简单的MVVM模式
    Prism学习笔记(一) 从Hello World开始
    修改Oracle数据库序列
    将身份证号转换为年龄
    获取文件类型
    下划线转驼峰
    驼峰转下划线
  • 原文地址:https://www.cnblogs.com/wls001/p/7306404.html
Copyright © 2020-2023  润新知