首页 > 其他 > 详细

51nod1428(优先队列)

时间:2017-01-17 23:45:18      阅读:418      评论:0      收藏:0      [点我收藏+]

题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1428

 

题意:中文题诶~

 

思路:贪心

问最少要多少教室就是求最多有多少个时间段产生了交集咯。我们先用结构体存储区间并将其按照左端点升序排列,若左端点相同则按右端点升序排列。

接下来遍历所有区间,并维护一个优先队列,其中存储区间右端点值。对于当前区间,我们将优先队列中所有比当前区间左端点小的元素删除(因为其所在区间不会与当前区间相交嘛),然后再将当前区间的右端点加入优先队列。当前优先队列的大小就是当前能得到的最大交集数。其中道理并不复杂就不多说啦。。。

 

代码:

 1 #include <bits/stdc++.h>
 2 #define MAXN 10010
 3 using namespace std;
 4 
 5 struct Node{
 6     int l, r;
 7 }gg[MAXN];
 8 
 9 int cmp(Node a, Node b){
10     return a.l==b.l?a.r<b.r:a.l<b.l;
11 }
12 
13 int main(void){
14     int n, ans=0;
15     cin >> n;
16     for(int i=0; i<n; i++){
17         cin >> gg[i].l >> gg[i].r;
18     }
19     sort(gg, gg+n, cmp);
20     priority_queue<int, vector<int>, greater<int> > q;
21     for(int i=0; i<n; i++){
22         while(!q.empty()){
23             int a=q.top();
24             if(a<=gg[i].l){
25                 q.pop();
26             }else{
27                 break;
28             }
29         }
30         q.push(gg[i].r);
31         int cnt=q.size();
32         ans=max(ans, cnt);
33     }
34     cout << ans << endl;
35     return 0;
36 }

 

51nod1428(优先队列)

原文:http://www.cnblogs.com/geloutingyu/p/6294773.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!