#6565. 国际象棋锦标赛 (Шаховски турнир)
国际象棋锦标赛 (Шаховски турнир)
题目名称:国际象棋锦标赛 (Шаховски турнир)
来源:Macedonian Programming Contests (马其顿编程竞赛)
题目描述
在斯科普里将举办一场国际象棋锦标赛,共有 名选手参加( 总是 的幂,)。每位选手都有一个自然数表示的评分(Rating)。

比赛采用单败淘汰制:
- 选手两两配对进行第一轮比赛(第1名对第2名,第3名对第4名……)。
- 评分高者晋级下一轮,评分低者淘汰。若评分相同,随机产生胜利者。
- 每一场比赛的**分差(Gap)**定义为:
胜者评分 - 败者评分。 - 组织者发现,如果所有比赛的分差之和最大,那么支付给选手的奖金总额就最少。
你可以自由安排选手的初始出场顺序。你的任务是找到一种排列方式,使得整个锦标赛中所有比赛的分差之和达到最大。
示例说明
假设选手评分为:2800, 2500, 2000, 1800, 1600, 1500, 1200, 800。
若按某种顺序排列,总分差之和可能为 5000;但如果交换评分 800 和 2000 的选手位置,总分差之和可以提升至 5800。
输入格式
- 第一行:一个整数 (),表示选手人数。
- 第二行: 个整数 (),表示选手的评分。输入数据已按非递增顺序(从大到小)排列。
输出格式
- 输出一个整数,代表最优排列下的最大分差总和。
限制要求
- 时间限制:300 毫秒
- 内存限制:1 兆字节 (1 MB)
- 注意:由于内存限制极小, 个
int占用约 2MB,因此你不能存储整个数组,必须边读边算或使用更小的数据类型。
样例 1:标准 8 人赛(题目配图对应的最优解)
此样例验证基础逻辑:最大分差总和 = 前 4 名之和 - 后 4 名之和。
输入 (1.in)
8
2800 2500 2000 1800 1600 1500 1200 800
输出 (1.out)
5800
(计算过程:(2800+2500+2000+1800) - (1600+1500+1200+800) = 9100 - 5100 = 4000... 抱歉,刚才口算有误,按照题目逻辑:冠军贡献 3 次,其余人根据被淘汰轮次贡献。公式简化后确实为:)
样例 2:最小规模 4 人赛(含重复分值)
验证当存在相同评分以及最小 时的处理。
输入 (2.in)
4
1000 1000 500 200
输出 (2.out)
1300
(计算过程:(1000 + 1000) - (500 + 200) = 1300)
样例 3:16 人赛(测试 long long 累加)
验证较大 下的求和稳定性。
输入 (3.in)
16
100 95 90 85 80 75 70 65 60 55 50 45 40 35 30 25
输出 (3.out)
640
(计算过程:前 8 项之和 640,后 8 项之和 340。。不对,公式应为前 8 项减后 8 项:$(100+95+90+85+80+75+70+65) - (60+55+50+45+40+35+30+25) = 660 - 340 = 320$。)