题目描述
2*N 名编号为 1~2N 的选手共进行R 轮比赛。每轮比赛开始前,以及所有比赛结束后,都会按照总分从高到低对选手进行一次排名。选手的总分为第一轮开始前的初始分数加上已参加过的所有比赛的得分和。总分相同的,约定编号较小的选手排名靠前。
每轮比赛的对阵安排与该轮比赛开始前的排名有关:第1 名和第2 名、第 3 名和第 4名、……、第2K – 1 名和第 2K名、…… 、第2N – 1 名和第2N名,各进行一场比赛。每场比赛胜者得1 分,负者得 0 分。也就是说除了首轮以外,其它轮比赛的安排均不能事先确定,而是要取决于选手在之前比赛中的表现。
现给定每个选手的初始分数及其实力值,试计算在R 轮比赛过后,排名第 Q 的选手编号是多少。我们假设选手的实力值两两不同,且每场比赛中实力值较高的总能获胜。
1、定义结构体存储数据,包括选手的编号、分数、实力;
2、首先用sort()函数对数据进行一次快排,按照分数从大到小,如果分数相同,编号小的在前;
3、参照题意进行模拟,每轮比赛后需要根据分数进行重新排序
① 若是用sort()函数进行快排,TLE超时;
②对数据进行分析,每轮比赛后,可将胜利者分为一组,负者分为一组;而这两组数据本身是排好序的(从大到小),因此考虑使用归
并排序;
4、最后的题解可以理解为 模拟+归并