活动安排问题
一个由需要使用某一资源的n个活动组成的集合S = {1, 2, ... , n},该资源一次只能被一个活动占用。每个活动i有个开始时间s[i]和结束时间f[i],且s[i] <= f[i]。一旦被选择,活动i就占据半开时间区间[s[i], f[i])。如果[s[i], f[j])与[s[i], f[j])互不重叠,则称活动i和j是兼容的。活动安排问题就是要选择一个由互相兼容的问题组成的最大集合。
ActivitySelectorMain.c
#include
<
stdio.h
>
void GreedyActivitySelector( int n, int * s, int * f, int * A);
void PrintActivity( int n, int * s, int * f, int * A);
/**/ /*
* n:活动个数
* s:活动开始时间
* f:活动结束时间
* 假设输入的活动按结束时间递增序排列:f[1] <= f[2] <= ... <= f[n]
* A:记录所选择的集合
*/
void GreedyActivitySelector( int n, int * s, int * f, int * A)
... {
int i, j;
A[0] = 1;
j = 0;
for(i = 1; i < n; i++)
...{
if(s[i] >= f[j])
...{
A[i] = 1;
j = i;
}
}
}
void PrintActivity( int n, int * s, int * f, int * A)
... {
int i;
for(i = 0; i < n; i++)
...{
if(A[i])
printf(" %d %d-->%d", i, s[i], f[i]);
}
}
int main( int argc, char ** argv)
... {
int s[] = ...{1, 3, 0, 5, 3, 5, 6, 8, 8, 2, 12};
int f[] = ...{4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
int A[11] = ...{0, };
int n;
n = 11;
GreedyActivitySelector(n, s, f, A);
PrintActivity(n, s, f, A);
return 0;
}
void GreedyActivitySelector( int n, int * s, int * f, int * A);
void PrintActivity( int n, int * s, int * f, int * A);
/**/ /*
* n:活动个数
* s:活动开始时间
* f:活动结束时间
* 假设输入的活动按结束时间递增序排列:f[1] <= f[2] <= ... <= f[n]
* A:记录所选择的集合
*/
void GreedyActivitySelector( int n, int * s, int * f, int * A)
... {
int i, j;
A[0] = 1;
j = 0;
for(i = 1; i < n; i++)
...{
if(s[i] >= f[j])
...{
A[i] = 1;
j = i;
}
}
}
void PrintActivity( int n, int * s, int * f, int * A)
... {
int i;
for(i = 0; i < n; i++)
...{
if(A[i])
printf(" %d %d-->%d", i, s[i], f[i]);
}
}
int main( int argc, char ** argv)
... {
int s[] = ...{1, 3, 0, 5, 3, 5, 6, 8, 8, 2, 12};
int f[] = ...{4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14};
int A[11] = ...{0, };
int n;
n = 11;
GreedyActivitySelector(n, s, f, A);
PrintActivity(n, s, f, A);
return 0;
}