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 }