活动安排问题
设有n个活动的集合E={1,2,3,…,n},所有的活动要求使用同一资源,而在同一时间内只有一个活动能使用这一资源,每个活动都有使用这一资源的开始时间si和结束时间fi,且si<fi。目标:要在所给的活动中,找出最大的相容的活动子集合。
性质:每次选择具有最早完成时间的相容活动加入集合中。
解:
活动安排问题:
与会场安排问题类似
不是需要多个会场,而是使用一个会场,尽可能多的安排活动
则对于活动进行根据结束时间进行排序
依次找出开始时间在上一活动之后的活动,在标记数组中赋值为 1 。
标记数组中为 1 则能被安排活动(理解会场安排问题此题更简单)
#include <stdio.h>
int main()
{
int n;
int *start,*end,*exists;
int i,j,k;
printf("请输入活动的个数:");
scanf("%d",&n);
start=new int [n];
end=new int [n];
exists=new int [n];
for(i=0;i<n;i++)
exists[i]=0;
printf("请输入活动的开始时间:");
for(i=0;i<n;i++)
scanf("%d",start+i);
printf("请输入活动的结束时间:");
for(i=0;i<n;i++)
scanf("%d",end+i);
for(i=0;i<n;i++){
for(j=i+1;j<n;j++){
if(end[i]>end[j]){
k=start[i];start[i]=start[j]; start[j]=k;
k=end[i];end[i]=end[j]; end[j]=k;
}
}
}
j=0;
exists[j]=1;
for(i=1;i<n;i++){
if(start[i]>=end[j]){
exists[i]=1;
j=i;
}
}
printf("可以安排的活动是:\n");
for(i=0;i<n;i++){
if(exists[i])
printf("%d ",i);
}
putchar('\n');
return 0;
}