赛马问题 算法

  • 64匹马,8个跑道,问最少比赛多少场,可以选出跑得最快的4匹马
  • Assumptions:每场比赛每个跑道只允许一匹马,且不存在并列情形

 

问题分析

  • step1:需8场比赛
    • 首先把64匹马随机分为8组并标记组别,遍历组别,比赛8次,并记录每组赛马名次(eg:A1>A2>...>A7>A8
    • 首先可直接剔除各组后四名赛马,剩余64-4*8=32匹赛马待定

 

  • step2:需1场比赛
    • 选出每组排名第一的赛马进行一次比赛,记录结果,不失一般性地,记为:A1>B1>C1>D1>E1>F1>G1>H1
    • 根据这轮比赛结果,首先可以剔除E、F、G、H这四组所有赛马(因为本组第一都未进入前4),剩余16匹马

    • 其次可以确定A1就是全场MVP,属全场N01,剩余15匹马待定
    • 还可以进一步细化
      • D组2-4名赛马:D2>D3>D4,不可能是Top4,可剔除这3匹,剩余15-3=12匹赛马待定
    • C组3-4名赛马:C3>C4,不可能是Top4,可剔除这2匹,剩余12-2=10匹赛马待定
      • B组第4名赛马:B4,也不可能是Top4,可剔除这1匹,剩余10-1=9匹赛马待定

 

  • step3:需1场or2场比赛
    • 当前剩余待定9匹赛马:A2>A3>A4,B1>B2>B3,C1>C2,D1
    • 因为可以确定B1>C1>D1,因此挑选:A2>A3>A4,B1>B2>B3,C1>C2( 或者 A2>A3>A4,B1>B2>B3,C1>D1)等8匹马进行一场比赛,剩余一匹赛马D1或者C2待定,重点关注C1名次
    • 仅需1场比赛情形
      • 当C1排名第3及以后,则选出本场前3名赛马,外加大佬A1,即为所求的Top4匹马
    • 需2场比赛情形
      • 因为已知B1>C1,所以C1本场名次区间为[2,8]
      • 当C1排名第2时,可推知B1排名本场第一,因此A1>B1>C1即为全场Top3匹马,此时可剔除B1,C1两匹马,剩余9-2=7匹马待定(如下)
        • 本轮上场剩余6匹:A2>A3>A4,B2>B3,C2
        • 未上场1匹:D1
      • 将本场剩余7匹赛马再进行一场比赛,一决高低,记录名次,选出本场排名第一的赛马,加上A1>B1>C1,即为全场Top4匹马。

 

posted @ 2021-04-01 10:32  简直😓  阅读(740)  评论(0编辑  收藏  举报