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 ]

到这一步,大家应该能看懂逻辑了。后面的验证就不写出来了,有兴趣的可以自己试着写一下

 

posted @ 2019-11-12 15:27  吹水哥  阅读(4224)  评论(1编辑  收藏  举报