会场安排问题
题目描述
假设要在足够多的会场里安排一批活动,并希望使用尽可能少的会场。设计一个算法进行安排。
输入
第一行一个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;
}