华为 · 模拟 · 算法编程题
华为 模拟 时限 1 秒 / 256 MB

题目描述

某电商平台希望根据用户的购物行为对用户进行分群,以便制定差异化的运营策略。
每位用户有三个特征指标:
purchase_amount(月均消费金额)
visit_frequency(月均访问次数)
return_rate(退货率,已归一化)
你需要实现 KMeans 聚类算法,将用户划分为若干个群体。
KMeans 算法的流程如下:给定 K 个初始聚类中心,计算每个数据点到各聚类中心的欧氏距离,将数据点分配到距离最近的聚类中心所在的组。然后对每个组重新计算中心点(即该组内所有数据点各维度的算术平均值),完成一轮迭代。
重复上述过程指定的迭代次数后,输出最终的 K 个聚类中心,每个维度的值保留两位小数(四舍五入)。
欧氏距离的计算公式为: d=√((x_1-x_2)^2+(y_1-y_2)^2+(z_1-z_2)^2)

输入输出

输入描述
第一行一个正整数 K,表示聚类中心的个数。
接下来 K 行,每行三个浮点数,表示初始聚类中心的三个特征值。
下一行一个正整数,表示迭代次数。
下一行一个正整数 m,表示数据点的个数。
接下来 m 行,每行三个浮点数,表示一个数据点的三个特征值。
输出描述
输出 K 行,每行三个数值,表示迭代结束后各聚类中心的三个特征值,保留两位小数,四舍五入。

样例共 2 组

样例 1 · 初始中心为 [10,20,30] 和 [40,50,60],共 6 个数据点,迭代 2 次。 第 1 轮:前三个点 (8,18,25)、(12,22,35)、(5,15,28) 距离中心 [10,20,30] 更近,分到第一组;后三个点 (42,48,58)、(38,52,62)、(45,55,65) 距离中心 [40,50,60] 更近,分到第二组。更新中心为 [8.33,18.33,29.33] 和 [41.67,51.67,61.67]。 第 2 轮:分配结果不变,中心保持不变。
输入
2
10 20 30
40 50 60
2
6
8 18 25
12 22 35
42 48 58
38 52 62
45 55 65
5 15 28
输出
8.33 18.33 29.33
41.67 51.67 61.67
样例 2 · 初始中心为 [5,5,5]、[15,15,15]、[25,25,25],共 4 个点,迭代 1 次。 (4,4,4) 和 (6,6,6) 距离中心 [5,5,5] 最近,分到第一组,新中心为 [(4+6)/2,(4+6)/2,(4+6)/2]=[5,5,5]。 (14,16,14) 距离中心 [15,15,15] 最近,分到第二组,新中心为 [14,16,14]。 (26,24,26) 距离中心 [25,25,25] 最近,分到第三组,新中心为 [26,24,26]。
输入
3
5 5 5
15 15 15
25 25 25
1
4
4 4 4
6 6 6
14 16 14
26 24 26
输出
5.00 5.00 5.00
14.00 16.00 14.00
26.00 24.00 26.00

算法解析依据充分

考点:模拟

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

题目画像

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

解题思路

推荐方向:模拟

本题切入点

按 KMeans 流程迭代指定次数:每次把数据点分到最近的中心,再对各组取各维算术平均作为新中心,最后输出中心保留两位小数。

不涉及复杂算法,把题目描述的流程原样翻译成代码逐步执行即可。

思路框架(模拟 通法 · 非本题专属)

  1. 用变量记录题目要求的「状态」(当前值、剩余数量、当前位置等)。
  2. 按题面给出的顺序,把每一步操作写成一段代码,逐条执行。
  3. 每一步执行后更新状态,并在题目要求的位置输出或累计答案。
  4. 注意循环的边界:执行多少次、何时终止、是否能终止。

实现要点:结构上通常是一个外层循环包住若干 if/else 分支;只要状态定义清楚,正确率很高。

复杂度:时间 O(操作次数) | 空间 O(状态数)

该范式的通法易错点

  • 终止条件写错导致死循环或漏做最后一次操作。
  • 状态更新顺序颠倒(先改了下标又用旧下标)。
  • 题目里「最多 / 恰好 / 至少」的语义差别没区分。

样例解读

样例 1:输入 2 / 10 20 30 / 40 50 60 / 2 / 6 / 8 18 25 / 12 22 35 / 42 48 58 / 38 52 62 / 45 55 65 / 5 15 28 → 输出 8.33 18.33 29.33 / 41.67 51.67 61.67

初始中心为 [10,20,30] 和 [40,50,60],共 6 个数据点,迭代 2 次。

第 1 轮:前三个点 (8,18,25)、(12,22,35)、(5,15,28) 距离中心 [10,20,30] 更近,分到第一组;后三个点 (42,48,58)、(38,52,62)、(45,55,65) 距离中心 [40,50,60] 更近,分到第二组。更新中心为 [8.33,18.33,29.33] 和 [41.67,51.67,61.67]。

第 2 轮:分配结果不变,中心保持不变。

样例 2:输入 3 / 5 5 5 / 15 15 15 / 25 25 25 / 1 / 4 / 4 4 4 / 6 6 6 / 14 16 14 / 26 24 26 → 输出 5.00 5.00 5.00 / 14.00 16.00 14.00 / 26.00 24.00 26.00

初始中心为 [5,5,5]、[15,15,15]、[25,25,25],共 4 个点,迭代 1 次。

(4,4,4) 和 (6,6,6) 距离中心 [5,5,5] 最近,分到第一组,新中心为 [(4+6)/2,(4+6)/2,(4+6)/2]=[5,5,5]。

(14,16,14) 距离中心 [15,15,15] 最近,分到第二组,新中心为 [14,16,14]。

(26,24,26) 距离中心 [25,25,25] 最近,分到第三组,新中心为 [26,24,26]。

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

本题来源:2026年-华为-3月4号AI岗。

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