贪心C 活动选择

来源:互联网 发布:mac删除系统文件 编辑:程序博客网 时间:2024/06/01 20:24

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>struct hd{    int b;    int e;    int h;  //存输入时的顺序序号,可以在结构体里定义,输出的时候不输出,只赋值} data[110],c;int main(){    int n,i,j;    int s[110]= {0};  //定义一个新的数组来存选入最后序列的序号    scanf("%d",&n);    for(i=1; i<=n; i++)    {        scanf("%d %d",&data[i].b,&data[i].e);        data[i].h=i;  //输入时的序号    }    for(i=1; i<=n-1; i++) //将结束的时间按照升序的序列排序,冒泡排序    {        for(j=1; j<=n-i-1; j++)        {            if(data[j].e>=data[j+1].e)            {                c=data[j];                data[j]=data[j+1];                data[j+1]=c;            }        }    }    int timestart=0;  //储存承接变量:上一个的结束时间    int num=0;  //新s数组的个数    for(i=1; i<=n; i++)    {        if(data[i].b>=timestart)        {            s[num]=data[i].h;            num++;  //共num个            timestart=data[i].e;        }    }for(i=0; i<=num-2; i++)    //共num个,从0开始所以i<num-1    {        printf("%d,",s[i]);    }                       //输出前num-1个    printf("%d\n",s[i]);         //最后一个单独输出    return 0;}