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

相关文章
相关标签/搜索