• [JSOI2007]建筑抢修


    1029: [JSOI2007]建筑抢修

    时间限制: 4 Sec  内存限制: 162 MB
    提交: 3695  解决: 1706

    题目描述

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

    输入

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

    输出

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

    样例输入

    4
    100 200
    200 1300
    1000 1250
    2000 3200

    样例输出

    3
    题解:
      贪心, 先把T2从小到大排列, 然后开始选择。
      选择之中会出现两种情况, 一种是可以抢修, 一种是不可抢修。
      可以抢修的情况直接计算, 并将时间累计。
      不可以抢修的情况下, 看看修复这个建筑物的时间和之前修复别的建筑物的时间, 如果比之前修复建筑物最多时间的还要多, 就说明有更优的方法存在。
      这时就将修复时间最长的那个替换为修复这个建筑物。
      具体实现用堆维护。
    #include <iostream>
    #include <algorithm>
    #define MAX 150000
    #define ll long long
    
    using namespace std;
    
    struct building
    {
        ll T1;
        ll T2;
    }Building[MAX], Heap[MAX];
    
    int cmp(const building & a, const building & b)
    {
        if(a.T2 != b.T2) return a.T2 < b.T2;
        return a.T1 < b.T1;
    }
    
    int Heapcmp(const building & a, const building & b)
    {
        return a.T1 < b.T1;
    }
    
    int main()
    {
        int N, tot = 0;
        ll ans = 0;
        cin >> N;
        for(int i = 1; i <= N; ++i)
            cin >> Building[i].T1 >> Building[i].T2;
        sort(Building + 1, Building + N + 1, cmp);
        for(int i = 1; i <= N; ++i)
        {
            if(ans + Building[i].T1 <= Building[i].T2)
            {
                Heap[++tot] = Building[i];
                push_heap(Heap + 1, Heap + 1 + tot, Heapcmp);
                ans = ans + Building[i].T1;
            }
            else if(tot != 0)
            {
                building step = Heap[1];
                if(Building[i].T1 >= step.T1) continue;
                pop_heap(Heap + 1, Heap + 1 + tot, Heapcmp);
                Heap[tot] = Building[i];
                push_heap(Heap + 1, Heap + 1 + tot, Heapcmp);
                ans = ans + Building[i].T1 - step.T1;
            }
        }
        cout << tot;
        return 0;
    }
    Sugar
  • 相关阅读:
    LINQ 详解
    oracle下查询的sql已经超出IIS响应时间
    IOC应用之 Ninject
    JSONP ---------跨域
    国内各大互联网公司相关技术站点2.0版 (集合腾讯、阿里、百度、搜狐、新浪、360等共49个)
    IO多路复用,以socket为例
    socket机制下实现的多用户与服务器交互
    在一个进程中定义多个线程
    基于tcp的socketserver,即tcp的多线程
    基于upd的socketserver,即udp的多线程
  • 原文地址:https://www.cnblogs.com/without-sugar/p/5859730.html
Copyright © 2020-2023  润新知