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

這是道頗有意思的題目,網上也有不少思路,但總感受不對太。因而本身又從新梳理了下最後發現,答案是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

相關文章
相關標籤/搜索