javascript
牛客网 【每日一题】5月26日题目精讲 [JSOI2007]建筑抢修
鏈接:
文章目錄
- 題目描述
- 題意:
- 題解:
題目描述
小剛在玩JSOI提供的一個稱之為“建筑搶修”的電腦游戲:經(jīng)過了一場激烈的戰(zhàn)斗,T部落消滅了所有z部落的入侵者。但是T部落的基地里已經(jīng)有N個建筑設(shè)施受到了嚴(yán)重的損傷,如果不盡快修復(fù)的話,這些建筑設(shè)施將會完全
毀壞。
現(xiàn)在的情況是:T部落基地里只有一個修理工人,雖然他能瞬間到達(dá)任何一個建筑,但是修復(fù)每個建筑都需要一定的時間。同時,修理工人修理完一個建筑才能修理下一個建筑,不能同時修理多個建筑。
如果某個建筑在一段時間之內(nèi)沒有完全修理完畢,這個建筑就報廢了。你的任務(wù)是幫小剛合理的制訂一個修理順序,以搶修盡可能多的建筑。
輸入描述:
第一行是一個整數(shù)N接下來N行每行兩個整數(shù)T1,T2描述一個建筑:修理這個建筑需要T1秒,如果在T2秒之內(nèi)還沒有修理完成,這個建筑就報廢了。
輸出描述:
輸出一個整數(shù)S,表示最多可以搶修S個建筑. N < 150,000; T1 < T2 < maxlongint
示例1
輸入
輸出
3題意:
其實就是給程序機(jī)會,讓它不斷試錯改正
我們按照截止時間排序,截止時間晚的我們可以留到后面做
先做早截止的,當(dāng)滿足:維修時間+前面維修所花時間<截止時間時,這樣樓才算被修復(fù)沒有報廢。
看似很好,但是每個樓的報廢時間與維修時間不成關(guān)系,也就是一個樓可能快要報廢了,但是維修時間賊長,我們先去維修他有可能得不償失,既沒有修好這個,又耽誤了后面。
當(dāng)我們維修一個的樓A,發(fā)現(xiàn)這個樓的下一棟樓B無法及時修復(fù)了,我們可以看看,如果修復(fù)A的時間比B長,那我們干脆直接修復(fù)B算了,反正都會有個樓報廢(無論修復(fù)A或B),這樣還可以給后面的樓留出更多的時間(因為排序后,B的修復(fù)時間比A短,這樣修完一個樓省的時間更多),這相當(dāng)于是一個不斷試錯改正的過程
這是一個維護(hù)過程,我們可以用優(yōu)先隊列,把修好的樓放在容器里,每次更新頂端(即維修時間最長的那個)
題解:
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=1e6+3;struct node{ll xiufu,baofei; }time[maxn];bool cmp(node a,node b){return a.baofei<b.baofei; } int n; priority_queue<int>q; ll sum=0;//當(dāng)前已用時間 ll tot=0;//修復(fù)樓的總數(shù) int main() {cin>>n;for(int i=1;i<=n;i++)cin>>time[i].xiufu>>time[i].baofei;scanf("%d%d",&time[i].xiufu,&time[i].baofei);sort(time+1,time+1+n,cmp);//按照報廢時間進(jìn)行排序 for(int i=1;i<=n;i++){if(sum+time[i].xiufu<=time[i].baofei)//當(dāng)可以及時修復(fù)時 {tot++;sum+=time[i].xiufu;//加入總時間 q.push(time[i].xiufu);//將修復(fù)時間存入 }else if(q.top()>time[i].xiufu)//如果來不及修復(fù),且當(dāng)前修復(fù)時間小于已修復(fù)的最大值,這樣就進(jìn)行更替 {sum-=q.top();q.pop();//把前一個棄掉 sum+=time[i].xiufu;//加入新的 q.push(time[i].xiufu);}}cout<<tot<<endl;return 0; } 創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的牛客网 【每日一题】5月26日题目精讲 [JSOI2007]建筑抢修的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 牛客网【每日一题】5月22日 [CQOI
- 下一篇: [JSOI2007]字符加密