华为 · 计算几何 · 算法编程题
华为 计算几何 时限 1 秒 / 256 MB

题目描述

在目标检测任务中,常需为候选框选择一组代表性的 Anchor 尺寸。现给定 N 个矩形框的宽和高,使用基于 IOU 距离的 k-means 聚类得到 K 个 Anchor。初始化时直接取前 K 个框作为初始中心;每轮迭代将每个样本分配给距离最近的中心;随后将每个簇内样本的宽、高分别取均值并向下取整作为新中心。若达到最大迭代次数 T,或新旧中心之间的总“位移”小于 1e-4(用 d=1−IOU 作为中心间距离,并对 K 个中心求和),则停止。最终按 Anchor 面积(宽×高)从大到小输出 K 个中心。
说明与约束
1.距离度量:d = 1 − IOU,其中 IOU = 交集面积 / 并集面积,交集面积 = min(w1,w2) × min(h1,h2),并集面积 = w1×h1 + w2×h2 − 交集面积。
2.所有距离与 IOU 的计算均用浮点;每轮更新后的中心宽、高先取均值再向下取整为整数。
3.若某簇在某轮为空,则该簇中心保持不变。
4.输出前按面积从大到小排序;若面积相同,可按宽、再按高降序作为次序规则。

输入输出

输入描述
第一行:N K T(以空格分隔)
接下来 N 行:每行两个整数 w h,表示一个检测框的宽与高。
输出描述
输出 K 行:每行两个整数,依次为一个 Anchor 的宽与高,按面积从大到小排序。

样例共 1 组

样例 1 · 初始中心为 (100,50)、(30,20)、(10,10)。 分配后每个簇的均值向下取整仍为 (100,50)、(30,20)、(10,10),迭代收敛。 按面积排序的结果如上。
输入
9 3 10
100 50
30 20
10 10
102 49
98 52
29 21
31 19
11 9
9 11
输出
100 50
30 20
10 10

算法解析依据一般

考点:计算几何

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

题目画像

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

解题思路

参考方向:计算几何

把几何关系转成坐标运算,用整数运算避免浮点误差。

思路框架(计算几何 通法 · 非本题专属)

  1. 把点、向量、线段用坐标表示。
  2. 几何判定(平行、垂直、共线、相交)尽量用叉积/点积的整数形式:叉积为 0 即共线。
  3. 距离用平方比较,避免开方带来的浮点误差。
  4. 面积用叉积(鞋带公式)计算。

实现要点:叉积 cross = x1*y2 - x2*y1;用它判断顺时针/逆时针和共线。

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

该范式的通法易错点

  • 用浮点相等判断几何关系(应用整数叉积)。
  • 没考虑三点共线、重合等退化情况。
本题在源数据中没有官方考点标签,方向由题面特征推断,仅供参考。

样例解读

样例 1:输入 9 3 10 / 100 50 / 30 20 / 10 10 / 102 49 / 98 52 / 29 21 / 31 19 / 11 9 / 9 11 → 输出 100 50 / 30 20 / 10 10

初始中心为 (100,50)、(30,20)、(10,10)。

分配后每个簇的均值向下取整仍为 (100,50)、(30,20)、(10,10),迭代收敛。

按面积排序的结果如上。

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

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

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