51Nod 1428 活动安排问题(贪心+优先队列)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_42391248/article/details/84856736

这道题真是折磨死我了。一看就知道是贪心,要排序,然后想了一个多小时,脑子真是越想越乱。

冷静冷静冷静!

慢慢想,最后想到了一个思路:用结构体存时段,按照起点从小到大排序。让第一个时段的终点进优先队列(从小到大排列)中,如果起点大于队头,就说明可以在同一个教室里面上课,就更新队头。最终队列长度就是所需的教室数。

ps:提交用c++11编译器

#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstdio>
using namespace std;
struct time{
	int t1,t2;
}a[10005];
bool cmp(time a,time b)
{
	if(a.t1==b.t1)
		return a.t2<b.t2;
	return a.t1<b.t1;
}
int main()
{
	int n,m,i,j;
	cin>>n;
	for(i=0;i<n;i++)
		cin>>a[i].t1>>a[i].t2;
	sort(a,a+n,cmp);
	int s1[10005],s2[10005];
	priority_queue<int,vector<int>,greater<int> >q;
	q.push(a[i].t2);
	for(i=0;i<n;i++)
	{
		if(a[i].t1>=q.top())
			q.pop();
		q.push(a[i].t2);
	}
	cout<<q.size()<<endl;
}

猜你喜欢

转载自blog.csdn.net/qq_42391248/article/details/84856736
今日推荐