算法之活动安排问题

1. 问题描述:设有一个活动的集合E={12,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有一个要求使用该资源的起始时间si和结束时间fisi<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)

猜你喜欢

转载自blog.csdn.net/qq_35503380/article/details/80395757