天天看點

活動選擇問題

輸入格式:

第一行輸入活動數目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;
}