這是道很有意思的題目,網上也有很多思路,但總感覺不對太。於是自己又重新梳理了下最后發現,答案是12回合。
具體的思路如下:
第一步:64匹馬,有8個賽道,那肯定要先把所有的馬給跑完於是這就用了8個回合。
然后根據8個回合按a-h組分組並以比賽名次進行編號,得到下面的一組數據:
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 h8
第二步:找出最快的那區馬
現在得到每個小組最快的馬:a1、b1、c1、d1、e1、f1、g1、h1比賽,最快的那匹馬就是第一名。
這一步我想大多數人都能理解是怎么回事。
第三步:找出第二、第三、第四快的馬(解題的重點,划重點了。考試必考)
假設:a1、b1、c1、d1、e1、f1、g1、h1比賽,a1跑的最快,那么就 a2、b1、c1、d1、e1、f1、g1、h1進行比賽找出第二名。
假設:a1、b1、c1、d1、e1、f1、g1、h1比賽,b1跑的最快,那么就 a1、b2、c1、d1、e1、f1、g1、h1進行比賽找出第二名。
假設:a1、b1、c1、d1、e1、f1、g1、h1比賽,c1跑的最快,那么就 a1、b1、c2、d1、e1、f1、g1、h1進行比賽找出第二名。
以次類推……
具體講解下思路 :首先經過第一輪比賽,分出a-h組的1-8名次。可知道這些馬的速度編號越小,速度趕快。那么a2的速度肯定小於a1,b2的速度肯定小於b1,以次類推……
假設a2比(b1、c1、d1、e1、f1、g1、h1)還要快,那么 a1肯定比(b1、c1、d1、e1、f1、g1、h1)快。
假設a3比(b1、c1、d1、e1、f1、g1、h1)還要快,那么 a2肯定也比(b1、c1、d1、e1、f1、g1、h1)快。
假設b2比(a1、c1、d1、e1、f1、g1、h1)還要快,那么 b1肯定比(a1、c1、d1、e1、f1、g1、h1)快。
假設b3比(a1、c1、d1、e1、f1、g1、h1)還要快,那么 b2肯定也比(a1、c1、d1、e1、f1、g1、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 ]
到這一步,大家應該能看懂邏輯了。后面的驗證就不寫出來了,有興趣的可以自己試着寫一下