1. 问题描述:设有一个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和结束时间fi且si<fi。如果选择了活动i,则它在半开时间区间[si,fi)内占用资源,若区间[si,fi)和区间[sj,fj)不相交,则称活动i与活动j是相容的。活动安排问题就是在所给的活动集合中选出最大的相容活动子集合。
2. 问题分析:将所给活动集合按照结束时间递增排序,首先将活动1添加进已选活动集合,然后依次检查后面的活动与已选活动集合中元素的相容性,若相容则将其添加进来,否则忽略然后检查下一个,直到结束。
#include <iostream>
using namespace std;
void GreedySelector(int n,int s[],int f[],bool A[])
{
A[0]=true; //将第一个活动添加进去
int index=0;
for(int i=1;i<n;i++)
{
if(s[i]>=f[index])
{
A[i]=true;
index=i;
}
else A[i]=false;
}
}
int main()
{
int s[]={1,3,0,5,3,5,6,8,8,2,12},
f[]={4,5,6,7,8,9,10,11,12,13,14};
bool A[11];
GreedySelector(11,s,f,A);
for(int i=0;i<11;i++)
cout<<A[i]<<" ";
}
3.复杂性分析:O(n)