zoukankan      html  css  js  c++  java
  • 作业10 相容问题

    1.     问题

    设S={1,2,…,n}为活动的集合,si和fi分别为活动i的开始和截止时间,i = 1,2…n。求出一个活动序列,使得这个序列中任意两个活动i,j满足 si=<fj或者sj =< fi(即不相容).

    2.     解析

    主要使用贪心算法来对问题进行解决,主要策略是把活动按照截止时间从小到大排序,然后从前向后挑选,只要与前面选中的活动相容,就可以把活动选入。

    贪心算法反例:把活动按照开始时间从小到大排序,然后从前向后挑选,只要与前面选中的活动相容,就可以把活动选入。

    正常贪心:

    i

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    Si

    3

    1

    3

    3

    7

    3

    1

    3

    6

    8

    Fi

    4

    5

    5

    6

    8

    8

    9

    9

    10

    10

    反例贪心:

    i

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    Si

    1

    1

    3

    3

    3

    3

    3

    6

    7

    8

    Fi

    5

    9

    4

    5

    6

    8

    9

    10

    8

    10

    由表可以看出反例求出的最大值并不正确

    3.     设计

    对所有活动进行排序

    Sep来存储上次选中的活动的结束时间,初始化为0

    For I from 0 to 活动的数量

           如果活动i的开始时间 >= sep

                  将活动i选出

                  将活动i的结束时间设置为sep

    4.     分析

    算法主要有两部分组成,选活动与排序,选活动就进行了一次遍历,复杂度为n,排序的复杂度为O(nlogn),因此整体复杂度为O(nlogn)

    5.     源码

    https://github.com/fanchile/Algorithm

  • 相关阅读:
    codevs 2632 非常好友
    codevs 1213 解的个数
    codevs 2751 军训分批
    codevs 1519 过路费
    codevs 1503 愚蠢的宠物
    codevs 2639 约会计划
    codevs 3369 膜拜
    codevs 3135 River Hopscotch
    数论模板
    JXOJ 9.7 NOIP 放松模拟赛 总结
  • 原文地址:https://www.cnblogs.com/Fanchile/p/12803512.html
Copyright © 2011-2022 走看看