码迷,mamicode.com
首页 > 其他好文 > 详细

Week 1 #H 建筑抢修

时间:2017-07-22 18:27:21      阅读:153      评论:0      收藏:0      [点我收藏+]

标签:str   ++   入侵者   结构体   input   end   电脑   turn   ext   

原题描述:

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 建筑抢修

标签:str   ++   入侵者   结构体   input   end   电脑   turn   ext   

原文地址:http://www.cnblogs.com/jonty666/p/7221595.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!