网上流传着这样一个面试问题:
25匹赛马,5个跑道,也就是说每次有5匹马可以同时比赛。问最少比赛多少次可以知道跑得最快的5匹马?
今天在CSDN论坛上又看到这个,仔细的想了想。我觉得很多给出算法的人都只是定式的考虑到每次只能5匹马比赛。
可是根据我的经验,赛马场是圈形的(我还专门查了赛马场的图片。。)。那么每次可以10匹马一起跑。每5匹向相反
方向跑。找出最先到达中间线的5匹。
我们把马分成3列:
A1,A2,A3,A4,A5,A6,A7,A8,A9,A10
B1,B2,B3,B4,B5,B6,B7,B8,B9,B10
C1,C2,C3,C4,C5
第一次:A1,A2,A3,A4,A5,A6,A7,A8,A9,A10 ->A1,A2,A3,A4,A5
第二次:B1,B2,B3,B4,B5,B6,B7,B8,B9,B10 ->B1,B2,B3,B4,B5
第三次:A1,A2,A3,A4,A5 B1,B2,B3,B4,B5 ->以A开头的串a(A1为最大,后四匹的AB顺序不考虑) 或以B开头串b(B1为最大后四匹的AB顺序不考虑)
第四次:a与A6,A7,A8,A9,A10比较 或b与B6,B7,B8,B9,B10比较 ->;E1,E2,E3,E4,E5
第五次:E1,E2,E3,E4,E5 C1,C2,C3,C4,C5 ->D1,D2,D3,D4,D5
D1,D2,D3,D4,D5为最快5匹。
所以最少次数为5次。
嗯,这是我的想法,不知道有什么纰漏没。。。暂时自己没发现。。等待论坛讨论结果。。。
今天在上班的路上又考虑这个问题,觉得第四步可以去掉,因为前三步已经可以比出前二十匹中最快的五匹,具体分析晚上回家再补上。此为手机添加。11月2号。
继续分析:
第一次比出的A1,A2,A3,A4,A5 和第二次比出的B1,B2,B3,B4,B5都是各组中最快的。
假如A1是在A1,A2,A3,A4,A5和B1,B2,B3,B4,B5最快的。
有人或许会问:A6,A7,A8,A9,A10可能比B1还快,如果这样的话,当上面的第三次比较时,结果还是A1,A2,A3,A4,A5,其他情况同此分析。
所以,三次比较后,就可以找出前20匹中最快的5匹。
