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[</
- 讀取家庭數量