N N匹馬,N個賽道,求出最快N匹馬的解法

2021-06-26 15:19:32 字數 4475 閱讀 5419

入門級:

81匹馬,9個賽道,不計時,最少要賽幾場可以求出最快四匹馬?

首先:分為9組分別進行比賽後得到每一組的比賽名次,比賽場次:9;

然後:將9組的每組第一名比賽,得到第一名,肯定是所有馬的第一名;比賽場次:1

最後:剩下馬中有資格角逐前四名的馬有a2、a3、a4、b1、b2、b3、c1、c2、d1,剛好有9匹馬,在進行一場比賽就可以了,比賽場次:1

所以最少進行11場比賽。

提高端:

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

注意: "假設每匹馬都跑的很穩定" 的意思是在上一場比賽中a馬比b馬快,則下一場比賽中a馬依然比b馬快。

稍微想一下,可以採用一種 競標賽排序(tournament sort)的思路。 見《選擇排序 》

(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場比賽的馬,那麼這場比賽的第1,2名一定是整個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場搞定。

設f(n,k)表示n*n匹馬,n個賽道,要找出前k名所需要比賽的場數。

當k = 1時,即要找出最快的那匹馬。很簡單,把所有馬分成n組,每組各賽一次,選出每組第一名再賽一次,得到的第一名就是最快的馬,f(n,k) = n + 1。

當k > 1 && k <= n時,同樣將所有馬分成n組,g[1], g[2],...,g[n], 每組比賽一次,得到每個組內的排名。不妨設第 i 組的排名就是g[i][1] > g[i][2] > g[i][3] > ... > g[i][n] (實力從強到弱)。再將各組第一名選出來賽一場,不妨設比賽結果為g[1][1] > g[2][1] > g[3][1] > ... > g[n][1],那麼g[1][1]即為第1名。

強    ------->   弱

|   g1: 1 2 3 4 ... n

|   g2: 1 2 3 4 ... n

|   ...

弱  gn: 1 2 3 4 ... n

第2名只能從g[1][2],g[2][1]中選。如果第2名是g[1][2],那第3名就要從g[1][3],g[2][1]中選;如果第2名是g[2][1],那第3名就要從g[1][2],g[2][2],g[3][1]中選,這種情況下需要比賽的馬更多。一般地,如果第i名(i >= 1 && i <= k)選出的是g[i][1]時,選第i+1名就需要從g[1][2], g[2][2], g[i][2], g[i+1][1]中選,這種情況下選出乙個名次所需要參賽的馬最多,選第i+1名就需要i+1匹馬參賽。於是選第2名,第3名,第4名,...,第k名所需的最多參賽馬匹數為2,3,4,...,k。選第2到第k名所需要安排的比賽場數就相當於將質量為2,3,4, ..., k的球放入最大承重為n的桶中,要求按順序放入,最少需要的桶的個數。比如,k=5, n=5,球重量為2,3,4,5,那麼2,3放入乙個桶,4,5各放乙個桶,需要3個桶。將質量為2到k的球放入承重為n的桶中所需的最少桶數記為w(n,k),那麼 f(n,k) = n + 1 + w(n,k);

當k > n時,每選出乙個大於n的名次,就需要n匹馬比賽一次,比賽場次數加1。那麼 f(n,k) = n + 1 + w(n,n) + k - n;

所以,如果k = 1, f(n,k) = n + 1

如果k>1 && k <= n, f(n,k) = n + 1 + w(n,k)

如果k>n, f(n,k) = n + 1 + w(n,k) + k - n

應用:36匹馬,6賽道,找出前6名需要的比賽場次為f(6,6) = 6 + 1 + w(6,6)。w(6,6)為將2,3,4,5,6依次放入容量為6的桶需要的最少桶數4。最少需要11場比賽。

N N匹馬,N個賽道,求出最快N匹馬的解法

入門級 81匹馬,9個賽道,不計時,最少要賽幾場可以求出最快四匹馬?首先 分為9組分別進行比賽後得到每一組的比賽名次,比賽場次 9 然後 將9組的每組第一名比賽,得到第一名,肯定是所有馬的第一名 比賽場次 1。在這9匹馬中,除了第一名是所有馬的第一名,第2 4名有資格角逐所有馬中的前4名,9個第一名...

N N匹馬,N個賽道,求出最快N匹馬的解法

入門級 81匹馬,9個賽道,不計時,最少要賽幾場可以求出最快四匹馬?首先 分為9組分別進行比賽後得到每一組的比賽名次,比賽場次 9 然後 將9組的每組第一名比賽,得到第一名,肯定是所有馬的第一名 比賽場次 1 最後 剩下馬中有資格角逐前四名的馬有a2 a3 a4 b1 b2 b3 c1 c2 d1,...

64匹馬,8個賽道,找出跑得最快的4匹馬

全部馬分為8組,每組8匹,每組各跑一次,然後淘汰掉每組的後四名,如下圖 需要比賽8場 取每組第一名進行一次比賽,然後淘汰最後四名所在組的所有馬,如下圖 需要比賽1場 這個時候總冠軍已經誕生,它就是a1,藍色區域 它不需要比賽了 而其他可能跑得最快的三匹馬隻可能是下圖中的黃色區域了 a2,a3,a4,...