賽馬問題

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

http://hxraid.iteye.com/blog/662643

http://www.bcwhy.com/thread-11411-1-1.html

http://blog.csdn.net/duandiangg/article/details/5960188

 

(1) 首先將25匹馬分成5組,並分別進行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、B1、C1、D1、E1]。

(2) 將[A1、B1、C1、D1、E1]進行第6場,選出第1名的馬,不妨設 A1>B1>C1>D1>E1. 此時第1名的馬爲A1。

(3) 將[A2、B1、C1、D1、E1]進行第7場,此時選擇出來的必定是第2名的馬,不妨假設爲B1。因爲這5匹馬是除去A1之外每個小組當前最快的馬。

(3) 進行第8場,選擇[A2、B2、C1、D1、E1]角逐出第3名的馬。

(4) 依次類推,第9,10場可以分別決出第4,5名的嗎。

因此,依照這種競標賽排序思想,需要10場比賽是一定可以取出前5名的。

仔細想一下,如果需要減少比賽場次,就一定需要在某一次比賽中同時決出2個名次,而且每一場比賽之後,有一些不可能進入前5名的馬可以提前出局。當然要做到這一點,就必須小心選擇每一場比賽的馬匹。我們在上面的方法基礎上進一步思考這個問題,希望能夠得到解決。

(1) 首先利用5場比賽角逐出每個小組的排名次序是絕對必要的。

(2) 第6場比賽選出第1名的馬也是必不可少的。假如仍然是A1馬(A1>B1>C1>D1>E1)。那麼此時我們可以得到一個重要的結論:有一些馬在前6場比賽之後就決定出局的命運了(下面綠色字體標誌出局)。

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]

(3) 第7場比賽是關鍵,能否同時決出第2,3名的馬呢?我們首先做下分析:

在上面的方法中,第7場比賽[A2、B1、C1、D1、E1]是爲了決定第2名的馬。但是在第6場比賽中我們已經得到(B1>C1>D1>E1),試問?有B1在的比賽,C1、D1、E1還有可能爭奪第2名嗎?當然不可能,也就是說第2名只能在A2、B1中出現。實際上只需要2條跑道就可以決出第2名,剩下C1、D1、E1的3條跑道都只能用來湊熱鬧的嗎?

能夠優化的關鍵出來了,我們是否能夠通過剩下的3個跑道來決出第3名呢?當然可以,我們來進一步分析第3名的情況?

● 如果A2>B1(即第2名爲A2),那麼根據第6場比賽中的(B1>C1>D1>E1)可以斷定第3名只能在A3和B1中產生。

● 如果B1>A2(即第2名爲B1),那麼可以斷定的第3名只能在A2,B2,C1 中產生。

好了,結論也出來了,只要我們把[A2、B1、A3、B2、C1]作爲第7場比賽的馬,那麼這場比賽的第2,3名一定是整個25匹馬中的第2,3名。

我們在這裏列舉出第7場的2,3名次的所有可能情況:

① 第2名=A2,第3名=A3

② 第2名=A2,第3名=B1

③ 第2名=B1,第3名=A2

④ 第2名=B1,第3名=B2

⑤ 第2名=B1,第3名=C1

(4) 第8場比賽很複雜,我們要根據第7場的所有可能的比賽情況進行分析。

① 第2名=A2,第3名=A3。那麼此種情況下第4名只能在A4和B1中產生。

● 如果第4名=A4,那麼第5名只能在A5、B1中產生。

● 如果第4名=B1,那麼第5名只能在A4、B2、C1中產生。

不管結果如何,此種情況下,第4、5名都可以在第8場比賽中決出。其中比賽馬匹爲[A4、A5、B1、B2、C1]

② 第2名=A2,第3名=B1。那麼此種情況下第4名只能在A3、B2、C1中產生。

● 如果第4名=A3,那麼第5名只能在A4、B2、C1中產生。

● 如果第4名=B2,那麼第5名只能在A3、B3、C1中產生。

● 如果第4名=C1,那麼第5名只能在A3、B2、C2、D1中產生。

那麼,第4、5名需要在馬匹[A3、B2、B3、C1、A4、C2、D1]七匹馬中產生,則必須比賽兩場才行,也就是到第9場角逐出全部的前5名。

③ 第2名=B1,第3名=A2。那麼此種情況下第4名只能在A3、B2、C1中產生。

情況和②一樣,必須角逐第9場

④ 第2名=B1,第3名=B2。 那麼此種情況下第4名只能在A2、B3、C1中產生。

● 如果第4名=A2,那麼第5名只能在A3、B3、C1中產生。

● 如果第4名=B3,那麼第5名只能在A2、B4、C1中產生。

● 如果第4名=C1,那麼第5名只能在A2、B3、C2、D1中產生。

那麼,第4、5名需要在馬匹[A2、B3、B4、C1、A3、C2、D1]七匹馬中產生,則必須比賽兩場才行,也就是到第9場角逐出全部的前5名。

⑤ 第2名=B1,第3名=C1。那麼此種情況下第4名只能在A2、B2、C2、D1中產生。

● 如果第4名=A2,那麼第5名只能在A3、B2、C2、D1中產生。

● 如果第4名=B2,那麼第5名只能在A2、B3、C2、D1中產生。

● 如果第4名=C2,那麼第5名只能在A2、B2、C3、D1中產生。

● 如果第4名=D1,那麼第5名只能在A2、B2、C2、D2、E2中產生。

那麼,第4、5名需要在馬匹[A2、B2、C2、D1、A3、B3、C3、D2、E1]九匹馬中 產 生,因此也必須比賽兩場,也就是到第9長決出勝負。

總結:最好情況可以在第8場角逐出前5名,最差也可以在第9場搞定。

 

同樣,需要決出前三名的話根據以上分析7場比賽就肯定可以了;

同樣的分析方法也使用與64匹馬,8個賽道的問題,N匹馬M個賽道問題的分析(N=M*M)

最後假設如果每個跑道都足夠長的話,能不能把每個跑到劃分爲幾段,比如每個劃分爲兩段,這樣就可以一場比賽參加馬匹的個數加倍了,不知道這樣可不可以(相當於並行運行這個程序)~~

 

第一開始我的想法就是簡單的外部歸併排序,相當於內存裝載不完的數據分塊排序,之後將各塊進行歸併,這樣對於25匹馬取前前5名的情況,在這裏就相當於5路歸併排序,需要10次就能完成,當然這只是最普通的一個想法。以上的是一種優化。

發佈了231 篇原創文章 · 獲贊 36 · 訪問量 142萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章