问题
如有以下11个活动:
要求最多可进行多少个活动
分析
对于这种问题,有三种方法:
(1)开始时间早的先排序
(2)占用时间少的先排序
(3)结束时间早的先排序
那么哪一种方法是正确的呢?
先来看看第一种:开始时间早的先排序
这告诉我们,如果开始时间早但占用时间长的话是不能优先排序的
那么来看看第二种方法:占用时间少的先排序
这说明,如果占用时间少但正好处于两个活动之间(不是指空闲的)那么此时也是不能优先排序的
那么第三种情况呢?
结束时间早的先排序
那么此时就可以尽可能多的容纳活动数目
代码实现
#include<stdio.h>
struct active{//保存活动开始结束时间和序号
int s,f;
int no;
}a[100];
int main()
{
int n,i,j,count=1;
printf("请输入活动个数:");
scanf("%d",&n);
printf("请输入各活动开始与结束时间\n");
for(i=0;i<n;i++){//创建活动
scanf("%d %d",&a[i].s,&a[i].f);
a[i].no=i+1;
}
for(i=0;i<n-1;i++){//冒泡排序,将活动结束时间短的排在前面
for(j=0;j<n-i-1;j++){
if(a[j].f>a[j+1].f){//交换
struct active t;
t.s=a[j].s;
t.f=a[j].f;
t.no=a[j].no;
a[j].s=a[j+1].s;
a[j].f=a[j+1].f;
a[j].no=a[j+1].no;
a[j+1].s=t.s;
a[j+1].f=t.f;
a[j+1].no=t.no;
}
}
}
int k=a[0].f;//第一个活动无论如何都一定存在
printf("活动序号为%d ",a[0].no);//输出活动序号
for(i=1;i<n;i++){
if(a[i].s>=k){
printf("%d ",a[i].no);
k=a[i].f;//更新活动结束时间
count++;
}
}
printf("\n最多%d个活动\n",count);
return 0;
}
代码验证
黄色标号为活动编号