1. 程式人生 > >建築搶修(優先隊列的運用)

建築搶修(優先隊列的運用)

判斷 bool ble else if main family truct iostream pan

題目鏈接:https://vjudge.net/problem/HYSBZ-1029

題目分析:

剛開始看題目,我以為建立一個包含t1,t2的結構體,然後將所有建築維修的摧毀時間進行排序,最後從小到大的將維修時間t1進行相加就可以了,結果WA;

後來發現如果前面那棟容易摧毀的建築的維修時間較長就有可能會耽誤後面的建築維修數量;所以就需要用到優先隊列,在滿足在房子摧毀以前能夠完全修繕的房子的維修時間放入隊列,否則在當前建築的維修時間小於優先隊列中的隊首元素時,將隊首元素換成當前的元素修繕時間;

AC代碼:

#include<iostream>
#include<queue>
#include<algorithm>


using namespace std;
struct Building
{
int t1;
int t2;
}b[150005];
bool cmp(Building a,Building b) //將t2進行排序
{
return a.t2<b.t2;
}
int main()
{
int n;
priority_queue <int>s;
cin>>n;
for (int i=0;i<n;i++)
cin>>b[i].t1>>b[i].t2;
sort (b,b+n,cmp);
int num=0,total_time=0;

for (int i=0;i<n ;i++)
{
if (b[i].t1<=b[i].t2-total_time) //判斷剩下的時間收否足夠修繕目前的這棟房子
{
s.push(b[i].t1);
num++;
total_time+=b[i].t1;
}
else if (s.top()>b[i].t1)
{
total_time-=(s.top()-b[i].t1);
s.pop();

s.push(b[i].t1);
}
}
cout << num << endl;
return 0;
}

建築搶修(優先隊列的運用)