活动安排问题
问题描述
设有n个活动的集合E={1,2,…,n},其中每个活动都要求使用同一资源,如演讲会场等,而在同一时间内只有一个活动能使用这一资源。每个活动i都有要求使用该资源的起始时间si和结束时间fi,且si<fi。如果选择了活动i,则它在半开时间区间[si,fi)内占用资源。若区间[si,fi)与区间[sj,fj)不相交,则称活动i和活动j是相容的。也就是说,当 s i ≥ f j s_i \geq f_j si≥fj 或 s j ≥ f i s_j \geq f_i sj≥fi 时,活动i与活动j相容。活动安排问题就是要在所给的活动集合中选出最大的相容活动子集合。
举例说明
例如,设待安排的11个活动的开始时间和结束时间按结束时间的非递减排列如下:
i | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 |
---|---|---|---|---|---|---|---|---|---|---|---|
s[i] | 1 | 3 | 0 | 5 | 3 | 5 | 6 | 8 | 8 | 2 | 12 |
f[i] | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 |
因为问题比较简单,下面直接上代码
C++代码实现
#include<iostream>
using namespace std;
//贪心选择算法
void GreedySelector(int n, int s[], int f[], bool A[]) {
A[1] = true;
int j = 1;
for (int i = 2; i <= n ; i++) {
if (s[i] > f[j]) {
A[i] = true;
j = i;
} else {
A[i] = false;
}
}
}
int main() {
bool A[12];
int n = 11;
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};
GreedySelector(n, s, f, A);
for (int i = 1; i <= 11; i++) {
cout << A[i] << " ";
}
cout << endl;
return 0;
}