华为 · 排序 · 算法编程题
华为 排序 N ≤ 100 时限 1 秒 / 256 MB

题目描述

小红正在为自研的无人驾驶配送机器人开发一套路径规划系统。为了提高效率,配送系统需要先将分散的包裹坐标通过无监督学习算法进行聚类,确定 K 个核心服务点,然后再由机器人按顺序前往这些点。
小红选用了经典的 K-Means 算法。具体聚类与路径规划逻辑如下:
1. 初始化:
- 如果服务中心数量 K 大于或等于包裹总数 N ,则每个包裹坐标直接作为最终的服务点坐标。
- 否则,先计算所有包裹到坐标原点 (0,0) 的欧几里得距离,并按距离从小到大排序。若距离相同,保持原始输入顺序。选取排序后的前 K 个包裹坐标作为初始聚类中心,并赋予编号 0 到 K-1 。
2. 聚类迭代(最多迭代 50 次):
- 分配阶段:将每个包裹分配给距离其最近的聚类中心。若某包裹到多个中心的距离相等,则分配给编号最小的中心。
- 更新阶段:将每个中心的位置更新为其所分配的所有包裹坐标的平均值。如果某个中心没有分配到任何包裹,则其坐标保持不变。
- 终止条件:计算所有中心在本次更新中移动的欧几里得距离之和。若该距离之和小于 10^-4 ,或者已完成 50 次迭代,则停止。
3. 路径规划与耗时计算:
- 聚类完成后,将最终得到的 K 个服务点坐标按其到原点 (0,0) 的欧几里得距离进行升序排列。
- 机器人从原点 (0,0) 出发,依次访问这 K 个点,最后返回原点 (0,0)。
- 计算机器人走完这段闭环路径的总长度,并根据平均时速计算总耗时。
请帮小红计算完成配送任务所需的总秒数。

输入输出

输入描述
第一行包含三个空格分隔的整数,分别是服务中心数量 K 、包裹总数 N ( 1 ≤ K ≤ 10,1 ≤ N ≤ 100 ),以及配送机器人的平均速度 speed( 1 ≤ speed ≤ 100 ,单位 km/h)。
接下来的 N 行,每行包含两个实数 x_i 和 y_i ( -100.0 ≤ x_i, y_i ≤ 100.0 ),表示每个包裹在地图上的公里坐标。
输出描述
输出一个整数,表示完成任务所需的总时间(秒)。结果请向下取整。

样例共 2 组

样例 1 · 在本样例中, K=2, N=3 ,机器速速度为 36 km/h。 1. 包裹到原点的距离分别为 5.0, 10.0, 5.0。排序后选择坐标 (3,4) 为中心 0,(0,5) 为中心 1。 2. 经过聚类迭代,中心 0 最终更新为 (4.5, 6.0),中心 1 为 (0.0, 5.0)。 3. 两个服务点到原点距离分别为 7.5 和 5.0。访问顺序为 (0,0) -> (0,5) -> (4.5, 6) -> (0,0)。 4. 总路径长度约为 5 + 4.6098 + 7.5 = 17.1098 km。 5. 总耗时约为 17.1098 / 36 × 3600 = 1710.98 秒,向下取整得 1710。
输入
2 3 36
3.0 4.0
6.0 8.0
0.0 5.0
输出
1710
样例 2 · For 3 communities, 10 packages, and speed 30 km/h, the 10 packages are clustered into 3 centers. Sorted by distance to the origin, the centers are approximately (1.5, 1.5), (-2.1, 3.1), and (5.15, 5.125). The total distance traversed visiting them in order and returning to the origin takes approximately 2502 seconds (floor applied). Note: if K >= N, all N points become their own cluster centers.
输入
3 10 30
1.2 1.5
1.8 1.2
5.0 5.2
5.5 4.8
4.9 5.5
-2.0 3.0
-2.5 3.5
-1.8 2.8
1.5 1.8
5.2 5.0
输出
2502

算法解析依据一般

考点:排序

数据规模 N ≤ 100 | 限制 1 秒 / 256MB | 标准输入输出

题目画像

  • 数据规模:N ≤ 100,K ≤ 10
  • 元素值域:speed ≤ 100,x_i ≤ 100,y_i ≤ 100(注意整数类型选择,避免溢出)
  • 复杂度门槛:允许 O(n³) ~ O(n⁴) 的多重循环,可以放心枚举。
  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

参考方向:排序

先用 O(n log n) 排序把无序变有序,后续处理往往就简单了。

思路框架(排序 通法 · 非本题专属)

  1. 排序后很多性质变简单:相邻关系、前缀性质、二分可行。
  2. 若题目禁止使用排序库函数,则手写快排/归并(归并还能顺带求逆序对)。
  3. 排序常与其他范式组合,比如「排序 + 贪心」「排序 + 二分」「排序 + 双指针」。

实现要点:在 C++ 中用 std::sort,Python 用 sorted();注意自定义比较函数的严格弱序。

复杂度:时间 O(n log n) | 空间 O(log n) ~ O(n)

该范式的通法易错点

  • 自定义比较函数不满足严格弱序会导致运行时崩溃。
  • 排序后丢失原始下标,题目需要下标时记得用 pair 一起排。

对照本题

  • 数据规模 N ≤ 100,允许 O(n³) ~ O(n⁴) 的多重循环,可以放心枚举。
  • 元素值域最大到 100 —— 求和 / 相乘时记得开 64 位整数。
本题在源数据中没有官方考点标签,方向由题面特征推断,仅供参考。

样例解读

样例 1:输入 2 3 36 / 3.0 4.0 / 6.0 8.0 / 0.0 5.0 → 输出 1710

在本样例中, K=2, N=3 ,机器速速度为 36 km/h。

  1. 包裹到原点的距离分别为 5.0, 10.0, 5.0。排序后选择坐标 (3,4) 为中心 0,(0,5) 为中心 1。
  2. 经过聚类迭代,中心 0 最终更新为 (4.5, 6.0),中心 1 为 (0.0, 5.0)。
  3. 两个服务点到原点距离分别为 7.5 和 5.0。访问顺序为 (0,0) -> (0,5) -> (4.5, 6) -> (0,0)。
  4. 总路径长度约为 5 + 4.6098 + 7.5 = 17.1098 km。
  5. 总耗时约为 17.1098 / 36 × 3600 = 1710.98 秒,向下取整得 1710。

样例 2:输入 3 10 30 / 1.2 1.5 / 1.8 1.2 / 5.0 5.2 / 5.5 4.8 / 4.9 5.5 / -2.0 3.0 / -2.5 3.5 / -1.8 2.8 / 1.5 1.8 → 输出 2502

For 3 communities, 10 packages, and speed 30 km/h, the 10 packages are clustered into 3 centers. Sorted by distance to the origin, the centers are approximately (1.5, 1.5), (-2.1, 3.1), and (5.15, 5.125). The total distance traversed visiting them in order and returning to the origin takes approximately 2502 seconds (floor applied). Note: if K >= N, all N points become their own cluster centers.

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:2026年-华为-04月08号AI岗。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解