• 活动选择


    活动选择

    Time Limit: 1000 ms Memory Limit: 65536 KiB

    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

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

    Sample Input

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

    Sample Output

    1,5,4

    Hint

     

    Source

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 struct node{//使用结构体
     4     int Start;//开始时间
     5     int End;//结束时间
     6     int Id;//活动号
     7 }data[10001];
     8 bool cmp(node x,node y){
     9     return x.End<y.End;//升序 对活动 结束时间 进行从小到大排序
    10 }
    11 int main()
    12 {
    13     int n;
    14     cin>>n;
    15     for(int i=0;i<n;i++){
    16         cin>>data[i].Start>>data[i].End;
    17         data[i].Id=i+1;
    18     }
    19     sort(data,data+n,cmp);//对  结束的时间进行  升序排序
    20     int time=data[0].End;//时间 等于 第一个 结束的 时间
    21     cout<<data[0].Id;//输出 第一个 活动编号
    22     for(int i=1;i<n;i++){//对剩余的 n-1个活动
    23         if(data[i].Start>=time){//若 剩余的 活动的 开始时间 比 这个上一个 活动的 结束 时间 晚了,可以选择这个个活动
    24             cout<<","<<data[i].Id;//此为贪心,但不一定是正确答案,只能保证是最优的
    25             time=data[i].End;
    26         }
    27     }
    28     cout<<endl;
    29     return 0;
    30 }
  • 相关阅读:
    DS博客作业03--树
    DS博客作业02--栈和队列tt
    DS博客作业02--线性表
    c博客06-结构体&文件
    C博客作业05--指针
    C语言博客作业04--数组
    C语言博客作业03--函数
    图书馆
    DS博客作业05——查找
    DS博客作业04——图
  • 原文地址:https://www.cnblogs.com/NirobertEinteson/p/11923063.html
Copyright © 2020-2023  润新知