一、题目描述
游戏里面,队伍通过匹配实力相近的对手进行对战。但是如果匹配的队伍实力相差太大,对于双方游戏体验都不会太好。
给定 n 个队伍的实力值,对其进行两两实力匹配,两支队伍实例差距在允许的最大差距 d内,则可以匹配。
要求在匹配队伍最多的情况下匹配出的各组实力差距的总和最小。
二、输入描述
第一行,n,d。队伍个数 n。允许的最大实力差距 d。
2<=n <=50
0<=d<=100
第二行,n 个队伍的实力值空格分割。
0<=各队伍实力值<=100
三、输出描述
匹配后,各组对战的实力差值的总和。若没有队伍可以匹配,则输出-1。
四、题目解析
四、Java算法源码
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int d = sc.nextInt();
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = sc.nextInt();
}
System.out.println(getResult(n, d, arr));
}
public static int getResult(int n, int d, int[] arr) {
Arrays.sort(arr);
ArrayList<Integer[]> diffs = new ArrayList<>();
for (int i = 1; i < arr.length; i++) {
int diff = arr[i] - arr[i - 1];
if (diff <= d) diffs.add(new Integer[]{i - 1, i, diff});
}
if (diffs.size() == 0) {
return -1;
}
ArrayList<Integer[]> res = new ArrayList<>();
dfs(0, diffs, new LinkedList<>(), res);
res.sort((a, b) -> Objects.equals(a[0], b[0]) ? a[1] - b[1] : b[0] - a[0]);
return res.get(0)[1];
}
public static void dfs(int index, ArrayList<Integer[]> diffs, LinkedList<Integer[]> path, ArrayList<Integer[]> res) {
for (int i = index; i < diffs.size(); i++) {
if (path.size() == 0 || path.getLast()[1] < diffs.get(i)[0]) {
path.add(diffs.get(i));
dfs(i + 1, diffs, path, res);
int count = path.size();
int sumDiff = path.stream().map(e -> e[2]).reduce((p, c) -> p + c).orElse(0);
res.add(new Integer[]{count, sumDiff});
path.removeLast();
}
}
}
五、效果展示
1、输入
6 30
81 87 47 59 81 18
2、输出
57
3、说明
18与47配对,实力差距29
59与81配对,实力差距22
81和87配对,实例差距6
总实力差距29+22+6=57
🏆本文收录于,华为OD机试(JAVA)(2022&2023)
本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。