活动选择问题
原创
©著作权归作者所有:来自51CTO博客作者凯凯凯炸的原创作品,请联系作者获取转载授权,否则将追究法律责任
输入格式:
第一行输入活动数目n(0<n<100);
以后输入n行,分别输入序号为1到n的活动使用中心的开始时刻a与截止时刻b(a,b为整数且0<=a<b<24,a,b输入以空格分隔)。
输出格式:
输出最佳安排序列所包含的各个活动(按照活动被安排的次序,两个活动之间用逗号分隔),如果有多个活动安排序列符合要求输出字典序最小的序列。最后输出最佳安排序列所包含的活动数。
输入样例:
6
8 10
9 16
11 16
14 15
10 14
7 11
输出样例:
1,5,4
最佳安排包含的活动数为3场
#include<stdio.h>
//因为要先对活动的截止时刻进行排序,所以一个活动的开始时刻和截止时刻应该放在一个结构体里,这样才能保证某个活动的截止时刻移动时,它的开始时刻还是相对应的
struct activity
{
int begin;
int end;
int select;
int num;
}a[101],t;
int main()
{
int n;
int i,j;
int s=0;
int x=0;
scanf("%d",&n);
for(i=0;i<n;i++)
{
scanf("%d %d",&a[i].begin,&a[i].end);
a[i].num=i+1;
a[i].select=0;
}
//将各个活动的截止时刻按升序排列
for(i=0;i<n-1;i++)
{
for(j=0;j<n-i-1;j++)
{
if(a[j].end>a[j+1].end)
{
t=a[j];
a[j]=a[j+1];
a[j+1]=t;
}
}
}
for(i=0;i<n;i++)
{
if(a[i].begin>=s)
{
a[i].select=1;
s=a[i].end;
}
}
printf("%d",a[0].num);
for(i=1;i<n;i++)
{
if(a[i].select==1)
{
printf(",%d",a[i].num);
x++;
}
}
printf("\n");
printf("最佳安排所包含的活动数为%d场",x+1);
return 0;
}