64匹馬,8個賽道,找出跑得最快的4匹馬需要幾(次)回合?


這是道很有意思的題目,網上也有很多思路,但總感覺不對太。於是自己又重新梳理了下最后發現,答案是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 ]

到這一步,大家應該能看懂邏輯了。后面的驗證就不寫出來了,有興趣的可以自己試着寫一下

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM