D - 活动选择

Description

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

最佳安排序列为:1,4,5。

Input

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

Output

输出最佳安排序列所包含的各个活动(按照活动被安排的次序,两个活动之间用逗号分隔),如果有多个活动安排序列符合要求输出字典序最小的序列。

Sample

Input

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

Output

1,5,4

题解:

求最多能安排的活动,将活动的结束时间按早晚排序,然后遍历安排即可。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;

int maxn = 105;
/**
*acts存储活动的开始时间,结束时间,和编号。
*/
struct acts{
    int be,en,num;
}act[105], t;

/**
*冒泡排序,将活动结束时间升序排序。
*/
void f(int n){
    int i, j;
    for(i=0; i<n-1; i++){
        for(j=0; j<n-1-i; j++){
            if(act[j].en>act[j+1].en){
                t = act[j];
                act[j] = act[j+1];
                act[j+1] = t;
            }
        }
    }
}

int main()
{
    int n;
    /**
    *k记录已经安排的活动数。
    *en记录当前所有活动的结束时间。
    */
    int i, en, k = 0;
    int a[maxn];
    scanf("%d",&n);
    for(i=0;i<n;i++){
        scanf("%d%d",&act[i].be,&act[i].en);
        act[i].num = i + 1;
    }
    f(n);
    en = act[0].en;
    a[k++] = act[0].num;
    //遍历安排活动,如果当前活动开始时间比上个活动结束时间晚,就安排上。
    for(i=1;i<n;i++){
        if(act[i].be >= en){
            en = act[i].en;
            a[k++] = act[i].num;
        }
    }
    for(i=0;i<k;i++){
        printf("%d%c",a[i],i==k-1?'\n':',');
    }
    return 0;
}

posted @ 2020-10-20 19:30  洛沐辰  阅读(389)  评论(0编辑  收藏  举报