卓越飞翔博客卓越飞翔博客

卓越飞翔 - 您值得收藏的技术分享站
技术文章21222本站已运行3412

如何使用C++中的活动选择算法

如何使用C++中的活动选择算法

如何使用C++中的活动选择算法

活动选择算法(Activity Selection Algorithm)是一种经典的贪心算法,用于解决活动安排问题。在给定一组活动的起始时间和结束时间的情况下,算法的目标是选择出最大的相容活动集合,即这些活动互不冲突且可以同时进行的最大数量的活动。本文将介绍如何使用C++实现活动选择算法,并附上具体的代码示例。

算法思路:

活动选择算法的基本思路是,首先根据活动的结束时间对活动进行排序。然后依次选择结束时间最早的活动,同时排除与该活动冲突的其他活动。具体的步骤如下:

  1. 首先,需要定义一个结构体来表示每个活动。结构体中包含活动的起始时间和结束时间。
struct Activity
{
    int start;
    int end;
};
  1. 然后,定义一个函数来实现活动选择算法。函数的输入是一个活动数组和数组的大小,输出是一个最大相容活动集合。
vector<Activity> activitySelection(Activity arr[], int n)
{
    // 根据结束时间对活动进行排序
    sort(arr, arr + n, [](Activity a, Activity b) {
        return a.end < b.end;
    });

    vector<Activity> selectedActivities;
    selectedActivities.push_back(arr[0]); //选择第一个活动

    int lastSelected = 0;
    //遍历剩余的活动
    for (int i = 1; i < n; i++)
    {
        if (arr[i].start >= arr[lastSelected].end)
        {
            selectedActivities.push_back(arr[i]);
            lastSelected = i;
        }
    }

    return selectedActivities;
}
  1. 最后,在main函数中构造一个活动数组并调用活动选择函数,打印输出最大相容活动集合。
int main()
{
    Activity arr[] = {{1, 2}, {3, 4}, {0, 6}, {5, 7}, {8, 9}, {5, 9}};
    int n = sizeof(arr) / sizeof(arr[0]);

    vector<Activity> selectedActivities = activitySelection(arr, n);

    cout << "最大相容活动集合:" << endl;
    for (int i = 0; i < selectedActivities.size(); i++)
    {
        cout << "(" << selectedActivities[i].start << ", " << selectedActivities[i].end << ")" << endl;
    }

    return 0;
}

代码示例解析:

首先,在定义的结构体中,将每个活动的起始时间(start)和结束时间(end)作为结构体的成员。

然后,在实现的活动选择函数中,首先根据活动的结束时间对活动数组进行排序,以便后续选择活动时可以方便地按照结束时间的顺序。

接着,定义一个vector容器 selectedActivities 来保存最大相容活动集合,并将第一个活动加入其中。

然后,从第二个活动开始遍历剩余的活动。如果当前活动的起始时间大于等于已选择的最后一个活动的结束时间,则将该活动加入到最大相容活动集合中,并将该活动设为当前已选择的最后一个活动。

最后,在main函数中创建一个活动数组,调用活动选择函数,并打印输出最大相容活动集合。

总结:

通过以上的示例代码,我们可以看到C++中如何实现活动选择算法。通过贪心策略,根据活动的结束时间来选择最大的相容活动集合。活动选择算法在实际生活中有广泛的应用,比如会议安排、项目管理等。

【参考文献】

[1] Cormen, T. H., Leiserson, C. E., Rivest, R. L., & Stein, C. (2009). Introduction to Algorithms (3rd edition). MIT Press.

卓越飞翔博客
上一篇: 如何使用PHP开发简单的在线调查问卷和数据分析功能
下一篇: 返回列表
留言与评论(共有 0 条评论)
   
验证码:
隐藏边栏