25匹馬,5條賽道,找出最快的5匹馬


前段時間面試的時候來了兩道邏輯題,一道粗細不均勻的繩子燒出15分鍾,比較簡單,思考了下就過了。但是這道關於馬的,想了很久感覺都沒有一個好的解法。

回來之后看了下,這道題據說是google的題,原題是選出最快的三匹馬。看了一下,大受啟發。三匹馬需要七次。我先貼一下我的結論,我這邊算出來的結果五匹馬應該是9次。

先說下步驟,這道題的算法我還沒歸納出來,但是解法頗有些頭腦風暴的感覺。首先先選出第一名,然后在第一名附近找出符合的第二三名,選出來之后再在后面選。頗有點動態規划的感覺,可惜我不會動態規划qaq,實在太笨了。

25匹馬,分成5組比拼,取每組第一名出來再跑一局。這樣選出來的第一名是不是妥妥的第一名。先把馬編號,分成abcde五個組,后面跟一個數字表示每一組的馬的排名。比如a1就是a組第一名,應該比較好理解。如下圖,

a1    b1    c1   d1    e1

a2   b2   c2   d2   e2

a3   b3   c3   d3   e3

a4   b4   c4   d4   e4

a5   b5   c5   d5   e5

上圖是角逐五次之后的編號,然后每組第一名們再進行一場比賽,排名就暫定為a1>b1>c1>d1>e1。這是個必然情況嘛,所以a1當之無愧的是第一名。

也就是六次比賽后選出了第一名,接下來那我們選二三名,找到所有距離a1距離為兩格的點,分別是a2,a3,b1,b2,c1。很湊巧,剛好只有五匹馬,再跑一次,取出前兩名。那就是最快的三匹馬了。這個時候進行了七次比賽。

這個時候,就需要頭腦風暴一下了,a2>a3,b1>b2&&b1>c1,也就是說a1,b1至少有一個是前三。那么兩兩分組,三四名可能是a2,a3和a2,b1和b1,b2和b1,c1。當然還要選出這里最后一名的馬,因為這是不算第一的五匹馬排名,算上第一的話,第五名起碼在六名開外了,所有慢於他的馬都不用管了,最后一名可能是a3,b2,c1。

然后來分類討論,一種一種來,首先是a1,a3。

如果他們是二三名,那么剩下的有競爭力的對手就是a4,a5,b1,b2,c1了。剛好五匹馬,就不考慮什么淘汰不淘汰了,直接跑選出前兩名,前兩名就是四五名。這樣的話次數只要+1就好了,也就是8次。

然后下一種,a2,b1。這種的話,對手就多了,a3,a4  b2,b3  c1,c2,d1。整整七匹馬,然后這個時候就考慮一下剛剛被淘汰的最后一名,分別是a3,b2,c1。好,如果是a3,那么a3,a4直接出局,同理,b2的話,b2,b3出局,c1的話后面一坨都沒了,這樣剪一下,剩下的馬只有4-5匹。所以再跑一次取前二,這種也是8次。

然后我做到這里感覺找到了真諦,直接想當然的以為是8次,殊不知,既然窮舉就要窮舉到底。

當是b1,b2的情況出現時,參賽選手加到了a2,a3,  b3,b4 ,c1,c2,d1。也還是七個人,如果上一輪墊底是c1,那么只有四馬要比,可是,如果是a3,那么還有六匹馬,這個時候就需要第二輪了。反正目前沒用小聰明發現有什么地方可以省的。那就是要+2了

接下來是b1,c1。參賽選手有a2,a3 b2,b3, c2,c3 d1,d2,e1。這次有九位了。九位數選出前二應該需要三次以上了,不過好在剛剛選了最后一名,a3或b2,起碼淘汰掉一匹馬。八名選前二就比較簡單了,先五匹馬比賽,把最菜的三匹換成剩下的三匹,選出前兩名。所以也還是要+2.

綜上,三匹和五匹之間需要再比兩次。選出三匹是7次,那么選出5匹我的答案是9次。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM