[Wikioi 2913][BZOJ 1029][JSOI 2007]建築搶修

來源:互聯網
上載者:User

標籤:貪心   二元堆積   資料結構   

題目描述 Description

小剛在玩JSOI提供的一個稱之為“建築搶修”的電腦遊戲: 經過了一場激烈的戰鬥,T部落消滅了所有z部落的入侵者。但是T部落的基地裡已經有N個建築設施受到了嚴重的損傷,如果不儘快修複的話,這些建築設施將會完全毀壞。現在的情況是:T部落基地裡只有一個修理工人,雖然他能瞬間到達任何一個建築,但是修複每個建築都需要一定的時間。同時,修理工人修理完一個建築才能修理下一個建築,不能同時修理多個建築。如果某個建築在一段時間之內沒有完全修理完畢,這個建築就報廢了。你的任務是幫小剛合理的制訂一個修理順序,以搶修儘可能多的建築。

輸入描述 Input Description

第一行是一個整數N,接下來N行每行兩個整數T1,T2描述一個建築:修理這個建築需要T1秒,如果在T2秒之內還沒有修理完成,這個建築就報廢了。

輸出描述 Output Description

輸出一個整數S,表示最多可以搶修S個建築。

範例輸入 Sample Input

4
100 200
200 1300
1000 1250
2000 3200

範例輸出 Sample Output

3

資料範圍及提示 Data Size & Hint

 N<150000,t<=15000

資料不是原資料,是本人自己出的資料。t的範圍也與原題不同。

又是一道貪心題,明眼人都能看出來,沒想到這個題居然會出現在JSOI省選裡,My Code才三十多行,真爽!不過這個貪心要用個大根堆來維護最優解,先將所有建築按其消失時間升序排序(越先消失的建築越要先搶救),用變數nowtime記錄目前時間,從第一個到最後一個建築判斷修了它後,是否會超出它的消失時間(這樣就搶救不了之後的建築了),如果是的話,就要在大根堆裡找出隊首建築,這個已經修好的建築是最耗時的,如果隊首建築的維修耗時比這個建築大,而且如果不修隊首建築的話,還能搶救這個建築,那麼就更新目前時間,去掉(不修)隊首建築,轉而將此建築入隊

所有建築遍曆完了後,大根堆中的元素數量就是能搶救回來的最多建築數了,輸出它即可

#include <stdio.h>#include <algorithm>#include <queue>#define MAXN 170000using namespace std;struct T{int t1,t2;friend bool operator<(T a,T b){return a.t2<b.t2;} //排序用}a[MAXN];priority_queue<int>q; //大根堆q儲存已經修理的建築的各自的修理所需時間int main(){int i,j,n,nowtime=0; //nowtime=目前時間scanf("%d",&n);for(i=1;i<=n;i++)scanf("%d%d",&a[i].t1,&a[i].t2);sort(a+1,a+n+1); //按結束時間升序排序for(i=1;i<=n;i++){if(nowtime+a[i].t1<=a[i].t2) //如果修完第i個建筑後的時間比第i個建築消失時間早{nowtime+=a[i].t1; //目前時間加上第i個建築所需修理時間q.push(a[i].t1); //將第i個建築所需修理時間入隊}//否則,在第i個建築消失前不能修好它,那麼就需要判斷是否需要舍掉之前一個修過的建築,騰出時間修這個建築else if(nowtime+a[i].t1-q.top()<=a[i].t2&&a[i].t1<=q.top()) //不修之前最費時的建筑後,這個建築能修好,且建築i費時比那個建築少,那個就舍掉那個最費時的建築{nowtime=nowtime+a[i].t1-q.top();q.pop();q.push(a[i].t1);}}printf("%d\n",q.size()); //最終大根堆裡的元素數目就是搶救回來的最多建築數return 0;}

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.