我的想法大概是这样的:在绝对稳定发挥的前提下,如果我们班数学第一名的学霸在全级是第四名,那我们班其他人也无法进入前四名,就没有竞逐前四名的资格。
所以,初赛让马分为8小组各自赛跑,然后将小组第一名放在一起跑第九场。
然后按小组第一名在第九场的排名进行小组编号,则第五组和之后的小组都没有第十场的参赛资格。
第四组第一名有参赛资格(上限全场第四名),但第四组后面其他马匹无参赛资格。
依次类推,
第三组只有一二名有参赛资格(上限按顺序对应全场第三四名);
第二组的一二三名有参赛资格(上限按顺序对应全场第二三四名);
第一组的一二三四名有参赛资格(上限按顺序对应全场前四名)。
由于第一组第一名已经确认为全场第一,故而提前夺冠,后面的马匹共计九匹,随便取出八匹进行第十场,淘汰后五位再与剩下一匹进行第十一场加以确定。
所以一共要跑十一场。
用js来写的话就好像下面这样:
function horseSort() {
let arr = [];//二维数组分配八场初赛
let arr0 = [];//64个数字
for (let i = 0; i < 64; i++) {
arr0[i] = i + 1;
}
for (let i = 0; i < 8; i++) {
arr[i] = [];
for (let j = 0; j < 8; j++) {
arr[i][j] = arr0.splice(Math.floor(Math.random() * arr0.length), 1)[0];
}
arr[i].sort(function (a, b) {
return a - b
}); //分配马匹并顺便跑完八场初赛。
}
//console.log(arr);
let arr9 = [];//第九场,把初赛第一名全部分配进来。
for (let i = 0; i < 8; i++) {
arr9[i] = [i, arr[i][0]]; //分配第九场,第一个元素是记载这匹马属于初赛哪一组。
}
arr9.sort(function (a, b) {
return a[1] - b[1]
}); //跑完第九场。
//console.log(arr9);
//准备工作完毕,开始第十场到第十一场,为了方便这里用一场跑完,考虑所有状况的话,234名只可能是这9匹的其中一匹,实际比赛可以分两场去跑。
let arr10 = [arr[arr9[0][0]][1], arr[arr9[0][0]][2], arr[arr9[0][0]][3], arr[arr9[1][0]][0], arr[arr9[1][0]][1], arr[arr9[1][0]][2], arr[arr9[2][0]][0], arr[arr9[2][0]][1], arr[arr9[3][0]][0]];
arr10.sort(function (a, b) {
return a - b
});
console.log(arr10);
}
最后只要输出的数组前三位是2,3,4就正确了。我运行了很多次,这个想法应该是正确的。