
如何使用C++中的活动选择算法
活动选择算法(Activity Selection Algorithm)是一种经典的贪心算法,用于解决活动安排问题。在给定一组活动的起始时间和结束时间的情况下,算法的目标是选择出最大的相容活动集合,即这些活动互不冲突且可以同时进行的最大数量的活动。本文将介绍如何使用C++实现活动选择算法,并附上具体的代码示例。
算法思路:
活动选择算法的基本思路是,首先根据活动的结束时间对活动进行排序。然后依次选择结束时间最早的活动,同时排除与该活动冲突的其他活动。具体的步骤如下:
- 首先,需要定义一个结构体来表示每个活动。结构体中包含活动的起始时间和结束时间。
struct Activity
{
int start;
int end;
};
- 然后,定义一个函数来实现活动选择算法。函数的输入是一个活动数组和数组的大小,输出是一个最大相容活动集合。
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;
}
- 最后,在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++中如何实现
.........................................................