华为OD机试真题 Java 实现【最佳对手】【2023Q1 200分】-LMLPHP

一、题目描述

游戏里面,队伍通过匹配实力相近的对手进行对战。但是如果匹配的队伍实力相差太大,对于双方游戏体验都不会太好。

给定 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 实现【最佳对手】【2023Q1 200分】-LMLPHP


🏆本文收录于,华为OD机试(JAVA)(2022&2023)

本专栏包含了最新最全的2023年华为OD机试真题,有详细的分析和Java解答。已帮助1000+同学顺利通过OD机考。专栏会持续更新,每天在线答疑。

华为OD机试真题 Java 实现【最佳对手】【2023Q1 200分】-LMLPHP

05-17 06:16