天天看点

活动选择问题

输入格式:

第一行输入活动数目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

输出样例:

#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;
}