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

题目描述

某电商平台需要把 N 位老客户按其 M 维非负整数特征划分为 K 个群组(2 ≤ K ≤ min(20, N))。为避免资源倾斜,要求每个群组的容量严格均衡:每组人数为 N//K 或 N//K+1,多出来的人数依次补给“中心编号较小”的群组。你需要实现一个“按顺序分配 + 均衡容量 + 中心取整”的 KMeans 变体,并用最终的中心点将一个新客户归到最近的中心。
算法规则
1) 初始中心为输入的前 K 位客户的特征。
2) 每一轮分配按客户输入顺序从 1 到 N 顺序处理。对每个客户:
·
计算其到每个中心的欧氏距离(可用“平方和”比较,无需开方)。
·
在“尚未满员”的中心里选择距离最小者;若有距离并列,取中心编号更小的。
·
每个中心的容量固定:前 N%K 个中心容量为 N//K+1,其余为 N//K。
3) 一轮分配完成后,更新每个中心为该组所有成员的逐维均值向下取整(floor)。
4) 若“本轮的分配结果和中心”与上一轮完全一致,则停止。
5) 输出时先将最终中心按字典序(先比第 1 维,再比第 2 维,依此类推)升序排序;随后给定新客户特征,计算他到“已排序中心”的距离,归到最近的中心;若有并列,选择字典序最小的中心。输出该中心在“排序后列表”中的序号(从 1 开始)。

输入输出

输入描述
· 第 1 行:N M K
· 第 2 ~ N+1 行:每行 M 个非负整数,表示一位老客户的特征
· 第 N+2 行:M 个非负整数,表示新客户的特征
输出描述
· 先输出 K 行:排序后的 K 个中心(每行 M 个整数)
· 再输出 1 行:新客户所在中心在排序后列表中的序号(从 1 开始)

样例共 1 组

样例 1 · 1.按“容量均衡 + 顺序分配”规则,4 个点分到两组容量各 2:{0,11} 与 {10,9}。 2.组中心为各组均值下取整:{5,9},再次分配不变,收敛。 3.新点 8 到中心 5、9 的距离分别为 9 和 1,选 9,排序后位次为 2。
输入
4 1 2
0
10
9
11
8
输出
5
9
2

算法解析依据一般

考点:排序

限制 1 秒 / 256MB | 标准输入输出

题目画像

  • 源站时限:1 秒(牛客口径,非本题专属门槛)

解题思路

参考方向:排序

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

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

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

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

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

该范式的通法易错点

  • 自定义比较函数不满足严格弱序会导致运行时崩溃。
  • 排序后丢失原始下标,题目需要下标时记得用 pair 一起排。
本题在源数据中没有官方考点标签,方向由题面特征推断,仅供参考。

样例解读

样例 1:输入 4 1 2 / 0 / 10 / 9 / 11 / 8 → 输出 5 / 9 / 2

1.按“容量均衡 + 顺序分配”规则,4 个点分到两组容量各 2:{0,11} 与 {10,9}。

2.组中心为各组均值下取整:{5,9},再次分配不变,收敛。

3.新点 8 到中心 5、9 的距离分别为 9 和 1,选 9,排序后位次为 2。

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

本题来源:2025年秋招-华为-12月3号AI岗。

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