题目描述
游戏里面,队伍通过匹配实力相近的对手进行对战。但是如果匹配的队伍实力相差太大,对于双方游戏体验都不会太好。
给定n个队伍的实力值,对其进行两两实力匹配,两支队伍实例差距在允许的最大差距d内,则可以匹配。
要求在匹配队伍最多的情况下匹配出的各组实力差距的总和最小。
输入描述
第一行,n,d。队伍个数n。允许的最大实力差距d。
- 2<=n <=50
- 0<=d<=100
第二行,n个队伍的实力值空格分割。
- 0<=各队伍实力值<=100
输出描述
匹配后,各组对战的实力差值的总和。若没有队伍可以匹配,则输出-1。
示例1
输入
6 30
81 87 47 59 81 18
输出
57
说明
18与47配对,实力差距29
59与81配对,实力差距22
81与87配对,实力差距6
总实力差距29+22+6=57
示例2
输入
6 20
81 87 47 59 81 18
输出
12
说明
最多能匹配成功4支队伍。
47与59配对,实力差距12,
81与81配对,实力差距0。
总实力差距12+0=12
示例3
输入
4 10
40 51 62 73
输出
-1
说明
实力差距都在10以上,
没有队伍可以匹配成功。
解题思路
给定 n
个队伍的实力值和一个允许的最大实力差距 d
,要求将队伍进行两两配对,满足每对队伍的实力差距不超过 d
,并且在尽可能多的匹配情况下,使所有匹配的实力差距的总和最小。如果没有符合条件的匹配,则输出 -1
。
动态规划思路
- 状态定义:
pairs[i]
:前i
个队伍中最多能匹配的队伍对数。min_sum[i]
:前i
个队伍的最小实力差距总和。
- 状态转移:
- 对于每一个队伍
i
,考虑是否将第i
和第i-1
个队伍配对。 - 如果配对成立(差距在允许范围内),则更新
pairs[i]
和min_sum[i]
,确保匹配数最多且差距总和最小。
- 对于每一个队伍
- 转移规则:
- 对每一组队伍,从第 2 组开始遍历