這是道頗有意思的題目,網上也有不少思路,但總感受不對太。因而本身又從新梳理了下最後發現,答案是12回合。html
具體的思路以下:dom
第一步:64匹馬,有8個賽道,那確定要先把全部的馬給跑完因而這就用了8個回合。測試
而後根據8個回合按a-h組分組並以比賽名次進行編號,獲得下面的一組數據:spa
a1 b1 c1 d1 e1 f1 g1 h1
a2 b2 c2 d2 e2 f2 g2 h2
a3 b3 c3 d3 e3 f3 g3 h3
a4 b4 c4 d4 e4 f4 g4 h4
a5 b5 c5 d5 e5 f5 g5 h5
a6 b6 c6 d6 e6 f6 g6 h6
a7 b7 c7 d7 e7 f7 g7 h7
a8 b8 c8 d8 e8 f8 g8 h8code
第二步:找出最快的那區馬htm
如今獲得每一個小組最快的馬:a一、b一、c一、d一、e一、f一、g一、h1比賽,最快的那匹馬就是第一名。blog
這一步我想大多數人都能理解是怎麼回事。排序
第三步:找出第2、第3、第四快的馬(解題的重點,劃重點了。考試必考)io
假設:a一、b一、c一、d一、e一、f一、g一、h1比賽,a1跑的最快,那麼就 a二、b一、c一、d一、e一、f一、g一、h1進行比賽找出第二名。function
假設:a一、b一、c一、d一、e一、f一、g一、h1比賽,b1跑的最快,那麼就 a一、b二、c一、d一、e一、f一、g一、h1進行比賽找出第二名。
假設:a一、b一、c一、d一、e一、f一、g一、h1比賽,c1跑的最快,那麼就 a一、b一、c二、d一、e一、f一、g一、h1進行比賽找出第二名。
以次類推……
具體講解下思路 :首先通過第一輪比賽,分出a-h組的1-8名次。可知道這些馬的速度編號越小,速度趕快。那麼a2的速度確定小於a1,b2的速度確定小於b1,以次類推……
假設a2比(b一、c一、d一、e一、f一、g一、h1)還要快,那麼 a1確定比(b一、c一、d一、e一、f一、g一、h1)快。
假設a3比(b一、c一、d一、e一、f一、g一、h1)還要快,那麼 a2確定也比(b一、c一、d一、e一、f一、g一、h1)快。
假設b2比(a一、c一、d一、e一、f一、g一、h1)還要快,那麼 b1確定比(a一、c一、d一、e一、f一、g一、h1)快。
假設b3比(a一、c一、d一、e一、f一、g一、h1)還要快,那麼 b2確定也比(a一、c一、d一、e一、f一、g一、h1)快。
以次類推……
那麼就能夠把出線的馬匹(即已經得到名次的馬匹)從該小組移除,並由該小組的剩餘的馬匹第一名與其它小組第一名進行比賽,即該場比賽最快的馬就是剩餘馬匹中最快的馬
因此,分組排名須要8次,找出第一名須要1次,找出第二名須要1次,找出第三名須要1次,找出第四名須要1次
即8+1+1+1+1=12次
簡單的代碼驗證:
先把0-63總64個數字,隨機生成並組合成數據以達到排序錯亂的效果:
1 var arr = [] 2 for (var i = 0; arr.length < 64; i++) { 3 var k = parseInt(Math.random() * 64) 4 if (arr.indexOf(k) < 0) { 5 arr.push(k) 6 } 7 };
獲得的數據: 每次數據都是隨機生成,不會產生如出一轍的數據,因此你們的測試的時候數據不樣的是正常的
1 //[ 0,14,54,19,34,6,2,32,35,20,13,9,3,49,61,11,31,39,21,16,57,46,26,44,29,62,43,36,23,55,1,42,53,24,56,41,15,51,5,59,12,40,58,27,48,38,52,33,18,28,10,37,25,17,45,30,22,50,7,47,4,63,60,8 ]
把64個數字按8個組,並按生小到大排序(上面說的第一步)
1 var a_arr=[arr[0],arr[1],arr[2],arr[3],arr[4],arr[5],arr[6],arr[7]].sort(function (a, b) {return a - b}) 2 var b_arr=[arr[8],arr[9],arr[10],arr[11],arr[12],arr[13],arr[14],arr[15]].sort(function (a, b) {return a - b}) 3 var c_arr=[arr[16],arr[17],arr[18],arr[19],arr[20],arr[21],arr[22],arr[23]].sort(function (a, b) {return a - b}) 4 var d_arr=[arr[24],arr[25],arr[26],arr[27],arr[28],arr[29],arr[30],arr[31]].sort(function (a, b) {return a - b}) 5 var e_arr=[arr[32],arr[33],arr[34],arr[35],arr[36],arr[37],arr[38],arr[39]].sort(function (a, b) {return a - b}) 6 var f_arr=[arr[40],arr[41],arr[42],arr[43],arr[44],arr[45],arr[46],arr[47]].sort(function (a, b) {return a - b}) 7 var g_arr=[arr[48],arr[49],arr[50],arr[51],arr[52],arr[53],arr[54],arr[55]].sort(function (a, b) {return a - b}) 8 var h_arr=[arr[56],arr[57],arr[58],arr[59],arr[60],arr[61],arr[62],arr[63]].sort(function (a, b) {return a - b})
獲得的數據
1 //a_arr [ 0, 2, 6, 14, 19, 32, 34, 54 ] 2 //b_arr [ 3, 9, 11, 13, 20, 35, 49, 61 ] 3 //c_arr [ 16, 21, 26, 31, 39, 44, 46, 57 ] 4 //d_arr [ 1, 23, 29, 36, 42, 43, 55, 62 ] 5 //e_arr [ 5, 15, 24, 41, 51, 53, 56, 59 ] 6 //f_arr [ 12, 27, 33, 38, 40, 48, 52, 58 ] 7 //g_arr [ 10, 17, 18, 25, 28, 30, 37, 45 ] 8 //h_arr [ 4, 7, 8, 22, 47, 50, 60, 63 ]
到這一步,你們應該能看懂邏輯了。後面的驗證就不寫出來了,有興趣的能夠本身試着寫一下
原文出處:https://www.cnblogs.com/gcjun/p/11842382.html