zoukankan      html  css  js  c++  java
  • 分治法——循环赛日程安排问题




    问题描写叙述:


    设有n2^k)位选手參加网球循环赛,循环赛共进行n-1天,每位选手要与其它n-1位选手比赛一场。且每位选手每天仅仅能赛一场,试安排比赛。

     

    举例说明:


    1,当n为偶数时,循环赛一共要进行n-1天;比方,有运动员:周董,信哥,蔡依林,小七。一共4个人,能够例如以下安排:



     

    运动员

    第一天

    第二天

    第三天

    周董

    信哥

    蔡依林

    小七

    信哥

    周董

    小七

    蔡依林

    蔡依林

    小七

    周董

    信哥

    小七

    蔡依林

    信哥

    周董

     


    能够看出。当四个人比赛的时候,要比3天才干所有比完。



     

    2,当n为奇数时,循环赛要进行n天;如图,现有运动员:周董,信哥。蔡依林

    ,比赛安排表例如以下:


     

    运动员

    第一天

    第二天

    第三天

    周董

    信哥

    蔡依林

    X

    信哥

    周董

    X

    蔡依林

    蔡依林

    X

    周董

    信哥

     


    能够看出,当n=3时,人数为奇数,而且出现轮空现象。

     



    综上。我们能够得出一个基本结论

     

     

    比赛次数=

    n为偶数

    n-1

    n为奇数

    n

     

     

     

    算法描写叙述:

     

    依照分治策略,我们将n个选手先一分为二。每组n/2人。假设n为奇数,则(n+1/2后分组。然后像我们一起的归并排序那样,一直分下去,直到最后仅仅有两个人比赛。

     


    举例说明。6个人比赛。须要比赛5天,安排例如以下:

     


    1

    2

    3

    4

    5

    6

    2

    1

    5

    3

    6

    4

    3

    6

    1

    2

    4

    5

    4

    5

    6

    1

    3

    2

    5

    4

    2

    6

    1

    3

    6

    3

    4

    5

    2

    1

     

     


    回忆我们的归并排序,归并排序是先分开。最后再合起来。

    这里也是。

     


    我们先将6个人分成2组。每组3个人([1,2,3],[4,5,6]),然后发现3是个奇数。然后在每组中+1个虚拟人:XY;这样,每组就变成了4个人,然后将这4个人在除以2。我们就得到了一个两两组合的小的组。

     


    首先来看[1,2]; [3,x]

     


    1

    2

    2

    1

     


    3

    X

    X

    3

     



    将这两组合起来:

     

     

    1

    2

    2

    1

    3

    X

    X

    3

     

     

    这样,第一天的比赛排好了,然后来排第二天的比赛。

     

    接下来第二天让13比較,这样2就仅仅能跟x比較了。

     

     

    1

    2

    3

    2

    1

    3

    3

    X

    1

    X

    3

    2

     



    依此类推。第三天,让1x比較,23比較:

     

    1

    2

    3

    x

    2

    1

    x

    3

    3

    X

    1

    2

    X

    3

    2

    1

     



    这里要得到3个选手的比赛安排,所以,我们将假象的X去掉。并将它的位置以*取代:


     

    1

    2

    3

    *

    2

    1

    *

    3

    3

    *

    1

    2

     

     

     

    然后我们也依照这个规律,安排[4,5,6]的日程,得到表格



     

    4

    5

    6

    *

    5

    4

    *

    6

    6

    *

    4

    5

     



    将前3天的日程安排合并起来:

     

    1

    2

    3

    *

    2

    1

    *

    3

    3

    *

    1

    2

    4

    5

    6

    *

    5

    4

    *

    6

    6

    *

    4

    5

     

     

     

    我们能够看到,第一天。36都空暇。能够让他们比赛。第二天,25都空暇,能够让他们比赛;第三天。14空暇,让他们相互比赛。

     


    所以,上表又一次安排,得到前3天的日程安排表:

     

    1

    2

    3

    4

    2

    1

    5

    3

    3

    6

    1

    2

    4

    5

    6

    1

    5

    4

    2

    6

    6

    3

    4

    5

     

     


    这样,我们就比較过了[1,2,3][4,5,6].

     

    然后循环下,得到:

     

    [1,2,3]& [5,6,4]

    [1,2,3]& [6,4,5]

     

     



    安排三天的比赛:

     

    1

    2

    3

    5

    2

    1

    6

    3

    3

    4

    1

    2

    5

    6

    4

    1

    6

    5

    2

    4

    4

    3

    5

    6

     



    1

    2

    3

    6

    2

    1

    4

    3

    3

    5

    1

    2

    6

    4

    5

    1

    4

    6

    2

    5

    5

    3

    6

    4

     




    选取黄色的日程安排,增加到前3天的日程安排表中:

     

    1

    2

    3

    4

    5

    6

    2

    1

    5

    3

    6

    4

    3

    6

    1

    2

    4

    5

    4

    5

    6

    1

    3

    2

    5

    4

    2

    6

    1

    3

    6

    3

    4

    5

    2

    1

     

     



    假设n恰好等于2^k,那么。安排日程表就变得比較简单了,我们先安排两位选手,


    1

    2

    2

    1

     



    安排4位选手:

     

    1

    2

    3

    4

    2

    1

    4

    3

    3

    4

    1

    2

    4

    3

    2

    1

     

    这时候,我们先依照两个选手的。将12的安排填好,然后填写左下角的安排,然后将左下角的元素抄到右上角,最后将左上角的元素抄到右下角。




    小结:


        分治法在将大问题一步一步两两分,直到划分成能够解决的小问题时,求出这些小问题的解,然后再将小问题合成大问题的解,可是前提是这些小问题在求解是不受到其它小问题的解的影响的。








     



  • 相关阅读:
    python第二十四课——set中的函数
    python第二十三课——dict中的函数
    python第二十二课——list函数
    10 编译PHP并与nginx整合
    09 nginx Rewrite(重写)详细解析
    07 nginx Location之正则匹配
    06 nginx Location详解之精准匹配
    JQ 修改样式
    05 nginx定时任务完成日志切割
    linux 时间与本地时间不对应解决办法
  • 原文地址:https://www.cnblogs.com/zsychanpin/p/6735423.html
Copyright © 2011-2022 走看看