题目:
有若干个活动,第i个开始时间和结束时间是[Si,fi),同一个教室安排的活动之间不能交叠,求要安排所有活动,最少需要几个教室?
Input
第一行一个正整数n (n <= 10000)代表活动的个数。
第二行到第(n + 1)行包含n个开始时间和结束时间。
开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000
Output
一行包含一个整数表示最少教室的个数。
Sample Input
3 1 2 3 4 2 9
Sample Output
2
解题思路:首先开结构体数组,然后根据起点排序,之后开优先队列,按照大端堆,不得不说优先队列真的很奇妙,不服气不行,这个玩意好用极了。将每个的结尾压入优先队列,去跟每个起点比较,如果小于起点的话,pop掉,因为肯定不会在和他们相交了。
ac代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<iostream>
#include<queue>
#define maxn 10000
using namespace std;
struct node{
int st;
int end;
}tt[maxn];
bool cmp(node a,node b)
{
if(a.st==b.st)
return a.end<b.end;
return a.st<b.st;
}
int n;
int main()
{
while(scanf("%d",&n)!=EOF)
{
int ans=-1,num=0;
for(int i=0;i<n;i++)
{
scanf("%d%d",&tt[i].st,&tt[i].end);
}
sort(tt,tt+n,cmp);
priority_queue<int ,vector<int>,greater<int> > q;
for(int i=0;i<n;i++)
{
while(!q.empty())
{
int a=q.top();
if(a<=tt[i].st)
q.pop();
else
break;
}
q.push(tt[i].end);
int cnt=q.size();
ans=max(ans,cnt);
}
printf("%d\n",ans);
}
return 0;
}