Week 1 #H 建筑抢修

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Week 1 #H 建筑抢修相关的知识,希望对你有一定的参考价值。

原题描述:

H - 建筑抢修

 

小刚在玩JSOI提供的一个称之为“建筑抢修”的电脑游戏:经过了一场激烈的战斗,T部落消灭了所有z部落的
入侵者。但是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
这道题我们定义了结构体,用到了优先队列还有定义的排序(贪心
结构体我们用来表示花费时间和限制时间。
优先队列是队列的升级版,他不在是先进先出了,而是有优先级,最原始的定义的越大的优先级越高也就是排在对首。当然其他函数都不变,只是front()函数又变回了top()函数。
我们定义一和cmp函数来定义新的排序。
我们先把限制时间按照从小到大的排序,看下时间超限了没有。没有就把修复时间放到优先队列中。如果超限了,就把队列的首元素(队列的最大整数)和超限的修复时间比较,大的话直接替换。可以想一想为什么可以直接替换。
AC代码:
 1 #include <iostream>
 2 #include <queue>
 3 #include <algorithm>
 4 using namespace std;
 5 const int N=150001;
 6 struct mmp
 7 {
 8      int T1,T2;
 9 }a[N];
10 priority_queue <int> team;
11 bool cmp(mmp x,mmp y){return x.T2<y.T2;}
12 int main()
13 {
14     int n,t=0,g=0;
15     cin>>n;
16     for(int i=1;i<=n;i++)
17         cin>>a[i].T1>>a[i].T2;
18     sort(a+1,a+n+1,cmp);
19      for(int i=1;i<=n;i++)
20      {
21          if(t+a[i].T1<=a[i].T2)
22         {
23             t+=a[i].T1;
24             g++;
25             team.push(a[i].T1);
26         }
27         else
28         {
29             if(team.top()>a[i].T1)
30             {
31                 t=t-team.top()+a[i].T1;
32                 team.pop();
33                 team.push(a[i].T1);
34             }
35         }
36      }
37      cout<<g<<endl;
38 }

 

以上是关于Week 1 #H 建筑抢修的主要内容,如果未能解决你的问题,请参考以下文章

$[JSOI2007]$建筑抢修

BZOJ1029 [JSOI2007]建筑抢修

bzoj1029 [JSOI2007]建筑抢修

「JSOI2007」建筑抢修

BZOJ 1029 JSOI2007 建筑抢修 贪心+堆

建筑抢修