会场安排问题

会场安排问题

题目描述

假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个算法进行安排。

输入

第一行一个n(n<=10000)代表任务总数
第二行到第(n + 1)行包含n个开始时间和结束时间。
开始时间严格小于结束时间,并且时间都是非负整数,小于1000000000

输出

输出最小需要多少会场数

样例输入

5
1 23
12 28
25 35
27 80
36 50
样例输出
3

开始我本来想按照开始时间排序,但一直按照结束时间排序,一直没发现,老是错48%,我就很好奇啊,今天做另一个题的时候,突然想起来,会不会是排序顺序错了,去看,还真写错了,所以,sort排序的时候,后面的参数用cmp(按照开始时间)而不是comp(按照结束时间)。

#include<bits/stdc++.h> //万物基于万能头文件
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
bool b[10001];//用一个bool数组标记这个会场是否已经安排上了 
struct meeting
{
	int start,end;
}a[10001];
int comp(const meeting &a,const meeting &b)
{
	return a.end<b.end;
}
int cmp(const meeting &a,const meeting &b)
{
	return a.start<b.start;
 } 
int main ()
{
	int n,ans,counts;
	int flag=0;
	freopen("D:\AAC.in","r",stdin);
	while(scanf("%d",&n)!=EOF)
	{
		flag++;
		memset(a,0,sizeof(a));
		ans=0;
		counts=n;			//假设最开始每场会议都要一个会场 
		memset(b,false,sizeof(b));		//最开始每场会议都还没安排 
		for(int i=1;i<=n;i++)
		cin>>a[i].start>>a[i].end;
		sort(a+1,a+n+1,cmp);	//根据会议的结束时间进行排序 
		for(int i=1;i<=n;i++)
		{
			int p,t; 
			if(!b[i])	//如果第i场会议还没安排上,以这场会议作为起点,寻找可以和这场安排一起的有几个 
			{
				ans++;
				p=i;
				t=i+1;
				while(t<=n)
				{
					if(a[p].end<=a[t].start&&!b[t])	//如果找到一个,这个点安排上
					{
						counts--;		//找到一个能和这场会议安排在一个会场里的,counts-- 
						p=t;			//再开始从这个个点往下走 
						b[t]=true;	
					}
					t++;
				}
			}
			b[i]=true;
		}
		cout<<ans<<endl;
		/*cout<<"This is the "<<flag<<" date."<<endl;
		cout<<"ans is : "<<ans<<endl;
		cout<<"counts is : "<<counts<<endl<<endl;*/
	}
	return 0;
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值