全网最全面的华为OD机试真题汇总,100%原题题库,不需要开会员即可查看全部内容,更多考题请查看真题库。
真题库:https://www.yuque.com/codernav.com/od
题目:最佳对手
知识点排序DFS搜索回溯
时间限制:1s 空间限制:256MB 限定语言:不限
题目描述:
游戏里面,队伍通过匹配实力相近的对手进行对战。
但是如果匹配的队伍实例相差太大,对于双方游戏体验都不会太好。
给定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以上,没有队伍可以匹配成功。
解题思路:
先对数据进行排序,方便获取最短差距
分两步:
1、从前往后筛选一下符合实力差距的队伍,并求出最短差距和
2、从后往前筛选一下符合实力差距的队伍,并求出最短差距和
取上面两步的最小值
此算法只获得160分,有四个测试用例没过,分别4、12、15、20,4和12在下面,其他两个个没有
真机测试用例:
1 10 5 10 20 30 40 50 60 70 80 90 100 正确答案: -1
2 6 20 55 82 57 55 41 52 正确答案:5
4 8 10 65 44 45 58 40 60 46 47 正确答案:4
12 30 5 47 100 82 7 97 52 74 9 20 80 76 1 98 64 98 55 63 44 11 29 23 61 2 23 44 70 41 78 21 31 正确答案:27
代码实现:
package com.codernav.demo.hwod.exam;
import java.util.Arrays;
import java.util.Scanner;
/**
* @title 最佳对手
* @Description 游戏里面,队伍通过匹配实力相近的对手进行对战。
* 但是如果匹配的队伍实例相差太大,对于双方游戏体验都不会太好。
* 给定n个队伍的实力值,对其进行两两实力匹配,两支队伍实例差距在允许的最大差距d内,则可以匹配。
* 要求在匹配队伍最多的情况下,匹配出的各组实力差距的总和最小。
* @Author 开发者导航
* @website https://codernav.com
* @date 2023/5/28
*/
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int num = scanner.nextInt();
int p = scanner.nextInt();
int[] in = new int[num];
for (int i = 0; i < num; i++) {
in[i] = scanner.nextInt();
}
in = Arrays.stream(in).sorted().toArray();
int result1 = 0;
for (int i = 0; i < in.length - 1; i++) {
if (!(in[i + 1] - in[i] > p)) {
result1 += (in[i + 1] - in[i]);
i++;
}
}
int result2 = 0;
for (int i = in.length - 1; i >= 1; i--) {
if (!(in[i] - in[i - 1] > p)) {
result2 += (in[i] - in[i - 1]);
i--;
}
}
int result = Math.min(result1, result2);
System.out.println(result == 0 ? -1 : result);
}
}
