活动安排问题

贪心算法
先对活动按照结束时间升序排序,此处省略排序步骤
贪心策略是:只要后者的开始时间大于等于前者的结束时间(即s[i]>=f[j])就选择
#include <iostream>
using namespace std;
const int N=1005;
int GreedySelector(int n,int s[],int f[], bool a[])
{
    a[1]=true;
    int j=1;
    int cnt=1;
    for(int i=2;i<=n;i++){
        if (s[i]>=f[j]){
            a[i]=true;
            j=i;
            cnt++;
        }
        else a[i]=false;
    }
    return cnt;
}
int main()
{
    int s[]={0,1,3,0,5,3,5,6,8,8,2,12};//开始时间
    int f[]={0,4,5,6,7,8,9,10,11,12,13,14};//结束时间
    bool b[N];
    int n=(sizeof(s)/sizeof(s[0]));
    cout<<"活动安排数量: "<<GreedySelector(n,s,f,b)<<endl;
    cout<<"安排如下:"<<endl;
    for(int i=1;i<=n;i++){
        if(b[i]) cout<<"活动 "<<i<<" :"<<s[i]<<"-"<<f[i]<<endl;
    }
    return 0;
}
View Code

 另一种函数传递数组并在函数中获取数组长度

#include <iostream>
using namespace std;
const int N=1005;
template<class T>
int greedySelector(T& s,T& f,bool a[])
{
    int n=sizeof(s)/sizeof(s[0]);//获得长度
    a[1]=true;
    int j=1;
    int cnt=1;
    for(int i=2;i<=n;i++){
        if (s[i]>=f[j]){
            a[i]=true;
            j=i;
            cnt++;
        }
        else a[i]=false;
    }
    return cnt;
}
int main()
{
    int s[]={0,1,3,0,5,3,5,6,8,8,2,12};//开始时间
    int f[]={0,4,5,6,7,8,9,10,11,12,13,14};//结束时间
    bool b[N];
    int n=sizeof(s)/sizeof(s[0]);
    cout<<"活动安排数量: "<<greedySelector(s,f,b)<<endl;
    cout<<"安排如下:"<<endl;
    for(int i=1;i<=n;i++){
        if(b[i]) cout<<"活动 "<<i<<" :"<<s[i]<<"-"<<f[i]<<endl;
    }
    return 0;
}
View Code

运行结果如下:

原文地址:https://www.cnblogs.com/wydxry/p/10205159.html