题目链接: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 }