zoukankan      html  css  js  c++  java
  • 活动选择(互相兼容的活动组成的最大子集问题)

    活动选择

    Time Limit: 1000MS Memory limit: 65536K

    题目描述

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



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

    输入

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

    示例输出

    1,5,4
    这道题有两种算法
    (一)贪心算法
    将结束的时间排序(优先选择结束时间早的),然后遍历一遍,判断是否会重复
    代码
    View Code
    #include<stdio.h>
    struct node
    {
        int s;
        int star;
        int end;
    }act[100],ab;
    int main()
    {
        int n,i,j,x,num;
        int a[100];
        scanf("%d",&n);
        for(i=0;i<n;i++)
        {
            scanf("%d%d",&act[i].star,&act[i].end);
            act[i].s=i+1;
        }
        for(i=0;i<n-1;i++)
        for(j=0;j<n-i-1;j++)
        {
            if(act[j].end>act[j+1].end)
            {
                ab=act[j];
                act[j]=act[j+1];
                act[j+1]=ab;
            }
        }
        num=0;
        for(i=0;i<n;i++)
        {
            if(i==0)
            {
                x=act[i].end;
                a[num]=act[i].s;
                num++;
            }
            else
            {
                if(x<=act[i].star)
                {
                    x=act[i].end;
                    a[num]=act[i].s;
                    num++;
                }
            }
        }
        for(i=0;i<num;i++)
        {
            if(i==num-1)
            printf("%d",a[i]);
            else
            printf("%d,",a[i]);
        }
        printf("\n");
        return 0;
    }

    (二)动态规划


     

  • 相关阅读:
    组装query,query汇总,query字段
    POJ 1276, Cash Machine
    POJ 1129, Channel Allocation
    POJ 2531, Network Saboteur
    POJ 1837, Balance
    POJ 3278, Catch That Cow
    POJ 2676, Sudoku
    POJ 3126, Prime Path
    POJ 3414, Pots
    POJ 1426, Find The Multiple
  • 原文地址:https://www.cnblogs.com/wanglin2011/p/2460958.html
Copyright © 2011-2022 走看看