1. 程式人生 > >建築維修(貪心)

建築維修(貪心)

ros bsp tor clas urn 接下來 gin 一個數 表示


入侵者。但是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

我就簡單敘述一下題目的解析和用到的方法,首先拿到題目,我就會發現這是一個類似貪心算法的題目;那貪心的是什麽呢?
1.我們希望能把花費時間最短的先修好;
2.我們希望保留保持時間最長的在最後;
3.我們要盡快修好即將超時的;

算法:對於這道題,我知道第一個數和第二個數是相關聯的,所以希望用到map來進行連接,這是可行的;(循環的使用叠代器即可)。
但我們仔細的想一下,這是一個建築construction類,包含函數成員和屬性(消耗的時間,維持的時間),因此在使用c++時,我們可以用
struct代替類。
至此,我們可以隨意的調用兩者了;
struct construction
{
    int x,y;
    void Read()
    {
        cin >> x >> y;
    }

    bool operator < (const construction &o) const
    {
        return y < o.y;
    }
}o[maxn];
void solve()
{
    sort(o,o+N);
    int use_time=0,complish=0;
    for(int i=0;i<N;i++)
    {
        
if(use_time+o[i].x<=o[i].y) { use_time+=o[i].x; q.push(o[i].x); complish ++; } else { int a = q.top(); if(a>o[i].x && use_time-a+o[i].x<o[i].y)//假設下一個的花費得的時間少於前面一個的時間,同時修好建築後不超時,說明這個才是局部最優解; { q.pop(); q.push(o[i].x); use_time += o[i].x-a; } } } cout << complish; }

借鑒 :JSZX11556

 

建築維修(貪心)