活动选择

    xiaoxiao2021-04-13  71

    Problem Description

    学校的大学生艺术中心周日将面向全校各个学院的学生社团开放,但活动中心同时只能供一个社团活动使用,并且每一个社团活动开始后都不能中断。现在各个社团都提交了他们使用该中心的活动计划(即活动的开始时刻和截止时刻)。请设计一个算法来找到一个最佳的分配序列,以能够在大学生艺术中心安排不冲突的尽可能多的社团活动。 比如有5个活动,开始与截止时刻分别为: 最佳安排序列为:1,4,5。

    Input

    第一行输入活动数目n(0<n<100); 以后输入n行,分别输入序号为1到n的活动使用中心的开始时刻a与截止时刻b(a,b为整数且0<=a,b<24,a,b输入以空格分隔)。

    Output

    输出最佳安排序列所包含的各个活动(按照活动被安排的次序,两个活动之间用逗号分隔)。

    Example Input

    6 8 10 9 16 11 16 14 15 10 14 7 11

    Example Output

    1,5,4

    代码如下 #include<stdio.h> #include<stdlib.h> struct node {     int num ,begin ,ends; }a[110]; int cmp(const void*a,const void*b) {     struct node*g = (struct node*)a;     struct node*h = (struct node*)b;     return g->ends - h->ends; } int main() {     int n ,i ,j ,k,b[111];     scanf("%d",&n);     for(i = 0;i<n;i++)     {         scanf("%d %d",&a[i].begin,&a[i].ends);//开始时间 结束时间         a[i].num = i+1;//活动序号     }     qsort(a,n,sizeof(struct node),cmp);//快排     k = 0;j = 0;     for(i = 0;i<n;i++)     {        if(a[i].begin>=k)            {                k = a[i].ends;                b[j++] = a[i].num;            }     }//选择开始最早的 结束最早的     for(i = 0;i<j;i++)     {         if(j == 1)         printf("%d\n",b[i]);         else         {             if(i == j-1)             printf("%d\n",b[i]);             else printf("%d,",b[i]);         }     }     return 0; }
    转载请注明原文地址: https://ju.6miu.com/read-668516.html

    最新回复(0)