一道面試題 賽馬問題

2021-06-14 07:19:28 字數 1308 閱讀 8397

from 酷殼

據說,這是google的面試題。面試題目如下:

一共有25匹馬,有乙個賽場,賽場有5個賽道,就是說最多同時可以有5匹馬一起比賽。假設每匹馬都跑的很穩定,不用任何其他工具,只通過馬與馬之間的比賽,試問,最少得比多少場才能知道跑得最快的5匹馬?(不能使用撞大運的演算法

很明顯這是乙個演算法題,網上有很多貼子在討論這個問題,不過都沒有給出乙個明確的答案。我想了想,想到下面的乙個演算法:

1)分成5組a,b,c,d,e,比五場。然後根據每場結果分別給這五組內的五匹馬排序(從快到慢)。

2)每組的頭名再賽一場,取走第一名,然後該組第二名頂上。

3)重複第二步,直到選出前5名。

這個演算法是比較笨的演算法,總計需要賽10次,這個演算法應該是萬無一失的。現在的問題的就,如何優化這個演算法,想了想,的確是有優化的空間的。也就是說,是可以少於10次的。

想了一想,上面的那個演算法自從第6次開始就使用5個排序陣列的頭名做「冒泡法」,總是挑乙個最優秀的出來,其實,在第6次以後除了挑出最優秀的,我們還可以在每次比賽後淘汰一些速度不行的,淘汰的馬匹數自然會比選出的更多,所以,一方面在找,另一方面在淘汰,找出前5名的速度應該會更快。

比如:我們假設比賽完第六場後,我們得到下面的排序:(每組排序是——快馬從左到右,各組頭名的排序是——快馬從上到下)

a組 a1 a2 a3 a4 a5

b組 b1 b2 b3 b4 b5

c組 c1 c2 c3 c4 c5

d組 d1 d2 d3 d4 d5

e組 e1 e2 e3 e4 e5

這樣,我們不但知道,a1是25匹馬里最快的馬,而且我們可以淘汰近一半的馬,比如e2,e3,e4,e5就可以全部淘汰了,為什麼呢,因為比e2快的馬有a1,b1,c1,d1,e1這五匹馬,所以,e2後面的馬是無法進入前五名了;同理,d3和其後面的也進入不了前5;同理,c4,c5,b5都可以淘汰。

於是,在第六輪後我們可以得知,除了a1外的top 4必然在下面這些馬中:

a組  a2 a3 a4 a5

b組 b1 b2 b3 b4 

c組 c1 c2 c3 

d組 d1 d2 

e組 e1

接下來的過程應該不必我多說了。重複前面的方法,盡可能淘汰無法進前n名的馬,於是後面的馬就越來越少,你所需要的比賽也會越來越少。

那麼,對於這個題,聰明的你知道最少要比賽幾場了嗎?

舉一反三,如果有64匹馬,8個賽道呢?不失一般性,如果有n匹馬,m個賽道呢?n = m*m,那麼公式是什麼呢?

期待你的答案!

一道面試題

一道面試題 射擊運動員10發打中90環有多少種可能,請編寫程式計算出來,並列印出結果,0環和10環均有效。打中90環就是沒打中10環,所以打中90環跟打中10環的可能性是一樣的。然後開始遞迴狂打槍,一到10就記錄 if params i 10 在迴圈的控制中已經排除了大於10的可能性 i 10 pa...

一道面試題

前些時候在找工作,就在準備結束此次找工作歷程的時候,去了一家公司面試,去了之後技術經理直接帶到一台電腦旁,給了一張紙條,上面是這樣的題目 用c或c 來實現 1 建立一棵樹,該樹的深度是隨機的,每個節點的位元組點數是隨機的。2 給每個節點分配一段隨機大小的記憶體空間,給每個節點賦乙個隨機數。3 遍歷這...

一道面試題

如果n為偶數,則將它除以2,如果n為奇數,則將它加1或者減1。問對於乙個給定的n,怎樣才能用最少的步驟將它變到1。例如 n 61 n 60 n 2 30 n 2 15 n 16 n 2 8 n 2 4 n 2 2 n 2 1 public class myclass public static vo...