会场安排问题
问题描述:
假设要在足够多的会场里安排一批活动,活动的开始时间和结束时间已知,并希望使用尽可能少的会场。设计一个有效的算法进行安排。
样例输入
5
1 23
12 28
25 35
27 80
36 50
样例输出
3
解:
会场安排问题:
此处使用结构体用来表示活动的起止时间以及是否被安排,
要想尽可能的使用少的会场,则一个会场中尽可能多的安排
问题是在一个会场中怎样尽量多的安排活动?
首先对结构体数组对于结束时间进行排序。
那么第一个活动结束之后,第二个活动的开始时间要在第一个活动之后,依次类推,
对结构体数组进行遍历,temp代表此会场上一活动的结束时间,如果开始时间大于temp并且flag=0,就可以安排在此会场
遍历一遍之后,一个会场的活动安排完成,当所有活动都被安排之后,结束循环。输出sum
#include <stdio.h>
#include <algorithm>
using namespace std;
struct active{
int start,end,flag;
} act[100];
bool cmp(struct active a,struct active b)
{
return a.end<b.end;
}
int main()
{
int n;
int count=0;//代表当前被安排的活动
int sum=0;//所需要会场数目
scanf("%d",&n);
for(int i=0;i<n;i++)
{
scanf("%d %d",&act[i].start,&act[i].end);
act[i].flag=0;
}
sort(act,act+n,cmp);
while(count<n)
{
int temp=0;
for(int i=0;i<n;i++)
{
if(act[i].start>=temp && act[i].flag==0)
{
temp=act[i].end;
act[i].flag=1;
count++;
}
}//会场所有活动安排完成
sum++;
}
printf("%d\n",sum);
return 0;
}