51nod 1428 活动安排问题

1428 活动安排问题 

有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室? 
Input
第一行一个正整数n (n <= 10000)代表活动的个数。
第二行到第(n + 1)行包含n个开始时间和结束时间。
开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000
Output
一行包含一个整数表示最少教室的个数。
Input示例
3
1 2
3 4
2 9
Output示例
2

贪心加优先队列。

先让开始时间排序,一开始开一个教室,把结束时间压入队列,然后遍历。开始时间>=队顶的话就说明可以使用对顶这个教室。否则就重新开一间教室。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int N = 10010;
 4 struct Nod {
 5     int l, r;
 6 }nod[N];
 7 int n;
 8 bool cmp(Nod &a, Nod &b) {
 9     return a.l < b.l;
10 }
11 int main() {
12     priority_queue<int,vector<int>, greater<int> >que;
13     cin >> n;
14     for(int i = 0; i < n; i ++) {
15         cin >> nod[i].l >> nod[i].r;
16     }
17     sort(nod,nod+n,cmp);
18     que.push(nod[0].r);
19     int ans = 1;
20     for(int i = 1; i < n; i ++) {
21         if(nod[i].l >= que.top()) {
22             que.pop();
23             que.push(nod[i].r);
24         } else que.push(nod[i].r);
25         int MAX = que.size();
26         ans = max(ans,MAX);
27     }
28     cout << ans << endl;
29     return 0;
30 }

 

posted @ 2018-04-17 22:28  starry_sky  阅读(285)  评论(0编辑  收藏  举报