瑞士轮1
题目描述
略,见链接
输入输出描述
略,见链接
输入输出样例
略,见链接
数据范围
1 0 8 10^8 108级
解题思路
首先看到题干就知道要用贪心+排序。
循环模拟比赛,一次循环算一场比赛,那么就要每次循环之后排个序。
看到数据范围是一亿级的,发现用 O ( n 2 ) \operatorname{O}(n^2) O(n2)的冒泡选择什么的会TLE。就想到用 O ( n log n ) \operatorname{O}(n\operatorname{log}n) O(nlogn)的归并/快排。在这里我决定用std::sort()[滑稽](然鹅sort会爆时间,于是我用归并)。
关于归并排序
归并排序的思想就是合并两个同序数组的线性方式——每次比较两个有序数组指针指向的值,谁更小(大)则放到temp数组里,然后删掉进入temp的元素,指针++。
于是代码就不难理解。
伪代码如下
FUNCTION merge(arr[], l, r) '归并排序, arr为待排序数组,l、r为数组左右指针。
IF l = r
EXIT
m = (l + r) / 2
'----分解----
CALL merge(arr