【Description】
设有n个活动的集合E={1,2,3······n},其中每个活动都要求使用同一个资源(如演讲会场),而在同一时间内只有一个活动能使用这一资源,每个活动i都有一个要求使用该资源的起始时间Si和一个结束时间Fi,且Si<Fi。如果选择了活动i,则他再改时间区域[Si,Fi]内占用资源,若区间[Si,Fi]和区间[Si,Fi]互不相交,则称活动i与活动j是相容的,活动安排问题要求在所给的活动集合范围内选出最大的相容的活动子集。
【Input】
首先输入n个教室,其次输入n行,每行两个数字,表示开始的时间和结束时间
【Output】
输出最少需要几个教室
【Sample Input】
3
1 2
3 4
2 9
【Sample Output】
2
**问题分析:**根据贪心算法的思想,我们要确保的是相容的数量最大,那么我们要求的就是结束的最早,也就是关键点在于判断结束时间、
源码如下:
#include<iostream>
#include<algorithm>
using namespace std;
struct Time
{
int start;
int end;
}time[255];
bool cmp(Time &a,Time &b)
{
if (a.end<=b.end)
return true;
return false;
}
void Getmin(Time time[],int n,int b[])//带入结构体数组(排序之后的) 只是给b数组赋值的函数
{
b[1]=1;//第一个活动肯定进入总时间
int next=1;//next是最近加入的活动的编号
for(int i=2;i<=n;i++)//遍历
{
if(time[i].start >= time[next].end)
{
b[i]=1;
next=i;
}
}
}
int main()
{
int n,b[255],sum=0;//n个教室 b是记入最近加入时间表的活动的编号
cin>>n;
memset(b,0,sizeof(b));
for(int i=1;i<=n;i++)
cin>>time[i].start>>time[i].end;
sort(time,time+n+1,cmp);//从小到大排序 根据的是结束时间
Getmin(time,n,b);
for(int j=1;j<=n;j++)
{
if(b[j] == 1)
sum++;
}
cout<<sum<<endl;
return 1;
}