【bzoj1029】[JSOI2007]建築搶修

來源:互聯網
上載者:User

標籤:pop   整數   bsp   需要   using   表示   for   順序   多個   

題目描述

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

題解

貪心+堆(優先隊列)

如果有a和b,且先a後b可行而先b後a不可行,那麼一定先選a後選b。

即ax+bx≤by,ax+bx>ay

即ay<by。

於是先按照截止時間從小到大排序,如果能選則選並把耗費時間加入到大根堆中,如果不能選,則看堆頂元素與耗費時間的大小關係,判斷能否減小目前時間。

#include <cstdio>#include <queue>#include <algorithm>using namespace std;struct data{int x , y;}a[150010];priority_queue<int> q;bool cmp(data a , data b){return a.y < b.y;}int main(){int n , i , ti = 0 , ans = 0 , t;scanf("%d" , &n);for(i = 1 ; i <= n ; i ++ )scanf("%d%d" , &a[i].x , &a[i].y);sort(a + 1 , a + n + 1 , cmp);for(i = 1 ; i <= n ; i ++ ){if(ti + a[i].x <= a[i].y)ti += a[i].x , ans ++ , q.push(a[i].x);else{t = q.top();if(a[i].x < t && ti - t + a[i].x <= a[i].y)q.pop() , q.push(a[i].x) , ti -= t - a[i].x;}}printf("%d\n" , ans);return 0;}

 

【bzoj1029】[JSOI2007]建築搶修

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.