2025 A卷 100分 题型
本专栏内全部题目均提供Java、python、JavaScript、C、C++、GO六种语言的最佳实现方式;
并且每种语言均涵盖详细的问题分析、解题思路、代码实现、代码详解、3个测试用例以及综合分析;
本文收录于专栏:《2025华为OD真题目录+全流程解析+备考攻略+经验分享》
华为OD机试真题《新学校选址》:
文章快捷目录
题目描述及说明
Java
python
JavaScript
C++
C
GO
题目名称:新学校选址
知识点:中位数、排序算法(如快速排序)
时间限制:1秒
空间限制:256MB
限定语言:不限
题目描述
为了缓解新学期学生人数暴涨的问题,小乐村需要建立一所新学校。考虑到学生上学的安全性,学校的位置必须满足所有学生家到学校的距离总和最短。假设学校和所有学生家都位于同一条直线上,请确定学校的最佳选址位置。若存在多个最优位置,则输出最小的位置值。
输入描述
- 第一行:整数
n
,表示家庭数量,取值范围[1, 1000]
。 - 第二行:一组整数
m
,表示每户家庭的位置(互不相同),取值范围[0, 10000]
。
输出描述
一个整数,表示学校的最佳位置。
示例1
输入:
5
0 20 40 10 30
输出:
20
说明:
20到各家庭的距离分别为20、0、20、10、10,总和为60,是最小值。
示例2
输入:
1
20
输出:
20
示例3
输入:
2
0 20
输出:
0
Java
问题分析
题目要求在一条直线上选择一个点建学校,使得所有家庭到该点的距离总和最小。根据数学原理,当数组有序时,中位数的位置能保证距离总和最小。若存在多个最优解,则取位置最小的那个。
解题思路
- 排序数组:将家庭位置按升序排列。
- 中位数定位:直接取排序后数组的中间位置元素。若数组长度为偶数,取中间两个位置中左侧的值(即索引为
(n-1)/2
的元素),满足题目要求的“最小位置”。
代码实现
import java.util.Arrays;
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 读取家庭数量int n = sc.nextInt();sc.nextLine(); // 跳过换行符// 读取家庭位置字符串并分割为数组String line = sc.nextLine();String[] parts = line.split(" ");int[] locations = new int[n];for (int i = 0; i < n; i++) {locations[i] = Integer.parseInt(parts[i]);}// 对家庭位置进行排序Arrays.sort(locations);// 计算中位数索引int midIndex = (n - 1) / 2;// 输出最优位置System.out.println(locations[midIndex]);}
}
代码详解
-
输入处理:
int n = sc.nextInt(); sc.nextLine(); // 跳过输入n后的换行符
- 读取家庭数量
n
,并处理换行符避免影响后续输入。
String line = sc.nextLine(); String[</
- 读取家庭数量