【51Nod - 1428】【活动安排问题】

题目:

有若干个活动,第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;
} 

猜你喜欢

转载自blog.csdn.net/qq_42505741/article/details/81606655