1. 程式人生 > >建築搶修

建築搶修

ons out div cout 遊戲 接下來 順序 input 特殊

 小剛在玩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;
}

  

建築搶修