① 想清思路
跟着问题,把算法推出来
展开三种选择的交换论证
取任意一个最优完整配对,只调整涉及本轮两名选手的两场,其余比赛保持。下面用A表示主动队伍、B表示对手;“≥”说的是实力或得分不会降低。
- A最弱>B最弱。原方案中,A最弱对Bⱼ,Aᵢ对B最弱。Aᵢ≥A最弱,所以Aᵢ原来已经赢B最弱。交换为A最弱对B最弱、Aᵢ对Bⱼ:前一场仍赢2分,后一场用更强选手,不会比A最弱原来的得分少。
- A最强>B最强。原方案中,A最强对Bⱼ,Aᵢ对B最强。A最强原来一定赢Bⱼ。交换为A最强对B最强、Aᵢ对Bⱼ:前一场仍赢2分,后一场对手更弱,得分不会减少。
- 两种都不成立。A最弱≤B最弱,A最强≤B最强。原方案中,A最弱对Bⱼ至多平局,Aᵢ对B最强也至多平局。交换为A最弱对B最强、Aᵢ对Bⱼ:若原两场都输,没有分需要补;若原来恰有一场平,Aᵢ对Bⱼ至少能平;若原来两场都平,且两端实力不同,Aᵢ对Bⱼ会赢2分;若两端一样,则所有剩余选手同实力,两场仍各平1分。因此交换不会使总分变小。
每一种情况下都存在包含本轮选择的最优方案。固定这场,剩下的人仍是同一种问题,便可以继续重复三条规则。
把思路的计算量算清楚
时间复杂度分析
顺便检查空间复杂度
② 样例核对
先读清输入,再核对两个输出
原题样例1
完整输入
2 1 3 2 4
预期输出
2 0
第一行2表示每队2人;红队实力为1、3,蓝队为2、4。输出先写红队最高分,再写最低分。
把本页思路带入样例
样例用来检验我们对过程的理解;算法为什么总是正确,要看每页前面的正确性说明。
③ 单步演示
一屏只看当前这一步
红蓝两队的配对
红、蓝编号始终是输入中的原编号;圆点内是实力。一条连线表示一场比赛。
为什么这一步这样做
④ 代码与评测
把思路写成代码
复制、下载与正式提交使用同一份代码。