数据结构与算法(贪心策略的应用:活动安排问题)

假设有n个活动的集合E={a1,a2,…,an},其每个活动都要求使用同一资源(如某个设备、教室、场地等),而在同一时间内只允许一个活动使用这一资源。
每个活动都有一个要求使用该资源的起止时间si,fi,且si=fj 或 sj >=fi。现要求在所给定的活动集中选出最大的相容活动子集。(提示:贪心策略)
主函数已经给出, 请补充 Sort 和 Select 函数。 答案区只提交两个函数代码,不允许补充或修改其他代码!
#define Maxn 100
//定义活动的类型
typedef struct act_Node
{ int Id; //活动ID
int s_Time; //活动开始时间
int f_Time; //活动结束时间
} ACND;
// ******** Sort 函数 **********
// ******** Select 函数 **********
int main()
{ ACND arr[Maxn];
int an,i;
cin>>an; //读入活动个数
//读入各个活动的编号和占用资源的起止时间
for(i=0;i cin>>arr[i].Id>>arr[i].s_Time>>arr[i].f_Time;
Sort(an,arr);
Select(an,arr);
return 0;
}
输入,有多行,第1行是活动的个数n,后面n行,每行3个整数,是每个活动的编号、占用资源的开始时间、结束时间
输出,选出的最大活动子集,即有多行,每行包括活动的编号、开始时间、结束时间。
例如:
输入:

11
1 3 8
2 2 13
3 1 4
4 5 7
5 6 10
6 8 11
7 12 14
8 5 9
9 3 5
10 0 6
11 8 12

输出:

3:1-4
4:5-7
6:8-11
7:12-14

贪心准则:活动结束早的先安排,结束时间相同时,开始时间早的先安排。
第一个活动一定先安排,当当前活动的开始时间大于等于上一个已经安排的活动的结束时间时,安排当前活动。

//对活动按贪心准则排序
void Sort(int n,ACND arr[])
{
    ACND t;
    for(int i=0;i<=n-1;i++)
    {
        for(int j=i+1;j<=n-1;j++)
        {
            if(arr[i].f_Time>arr[j].f_Time)
            {
                t=arr[i];
                arr[i]=arr[j];
                arr[j]=t;
            }
            else if(arr[i].f_Time==arr[i].f_Time)
            {
                if(arr[i].s_Time>arr[i].s_Time)
                {
                    t=arr[i];
                    arr[i]=arr[j];
                    arr[j]=t;
                }
            }
        }
    }
}

//进行贪心选择,得到最大相容的活动集合输出
void Select(int n,ACND arr[])
{
    cout<<arr[0].Id<<":"<<arr[0].s_Time<<"-"<<arr[0].f_Time<<endl;
    int last=arr[0].f_Time;
    for(int i=1;i<=n-1;i++)
    {
        if(last<=arr[i].s_Time)
        {
            last=arr[i].f_Time;
            cout<<arr[i].Id<<":"<<arr[i].s_Time<<"-"<<arr[i].f_Time<<endl;
        }
    }
}

你可能感兴趣的:(数据结构和算法)