1. 程式人生 > >演算法之活動安排問題

演算法之活動安排問題

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)