• 建筑抢修


     小刚在玩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数组进行排列,但是要思考到 100 200 /100 200/ 10 200/90 200 这样的特殊情况,要考虑到最优情况,所以用优先队列,将T1放进去

    #include<iostream>
    #include<queue>
    #include<algorithm>
    using namespace std;
    #define N 150005
    int t;
    struct bulid
    {
        long long t1,t2;
        bool operator < (const bulid &cmp)const
        {
            return t2<cmp.t2;
        }
    }x[N];
    int main()
    {
        priority_queue<int>pq;
        cin>>t;
        for(int i=0;i<t;i++)
            cin>>x[i].t1>>x[i].t2;
        sort(x,x+t);
        int sum=0,count=0;
        for(int i=0;i<t;i++)
        {
            if(x[i].t1+sum<=x[i].t2)
            {
                sum+=x[i].t1;
                pq.push(x[i].t1);
                count++;
            }
            else if(x[i].t1<pq.top())
            {
                sum=sum-pq.top()+x[i].t1;
                pq.pop();
                pq.push(x[i].t1);
            }
        }
        cout<<count<<endl;
        return 0;
    }
    

      

  • 相关阅读:
    素数推断算法(高效率)
    Hibernate的fetch
    TRIZ系列-创新原理-22-变害为利原理
    Offer是否具有法律效力?
    浅谈C++多态性
    C语言scanf函数详解
    大话设计模式之原型模式
    Android源码文件夹结构
    简单的REST的框架实现
    android startActivityForResult的用法
  • 原文地址:https://www.cnblogs.com/zzzying/p/7204690.html
Copyright © 2020-2023  润新知