这是道很有意思的题目,网上也有很多思路,但总感觉不对太。于是自己又重新梳理了下最后发现,答案是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 ]
到这一步,大家应该能看懂逻辑了。后面的验证就不写出来了,有兴趣的可以自己试着写一下