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

题目描述

小红目前是某云服务平台的 AI 工程师。为了更精准地分配机房带宽资源,她打算训练一个简单的线性神经元模型,用于实时预测每台服务器的出口带宽需求。
该模型接受两个输入特征:当前活跃连接数 x_1 和历史平均延迟指标 x_2 。模型的预测输出 y_pred 的计算方式如下:
y_pred = w_1 x_1 + w_2 x_2 + b
其中 w_1, w_2 为特征权重, b 为偏置项。
为了让模型能够处理大规模的实时数据流,小红决定采用 AdamW 优化器进行参数更新。具体算法流程如下:
1. 初始化:初始参数 w_1 = 0, w_2 = 0, b = 0 。对应的动量估计(一阶矩) m 和平方梯度估计(二阶矩) v 也均初始化为 0。
2. 梯度计算:对于每个样本,给定真实带宽值 y_true ,各参数的梯度定义为:
- g_w_1 = 2(y_pred - y_true)x_1
- g_w_2 = 2(y_pred - y_true)x_2
- g_b = 2(y_pred - y_true)
3. 参数迭代:设当前正在处理第 t 个样本( t 从 1 开始),对于每一个参数 ∈ w_1, w_2, b ,执行以下更新:
- m_t = _1 m_t-1 + (1 - _1) g_t
- v_t = _2 v_t-1 + (1 - _2) g_t^2
- m_t = m_t / (1 - _1^t)
- v_t = v_t / (1 - _2^t)
- _t = _t-1 - (m_t√()v_t + + _t-1)
4. 超参数设置:
小红使用了以下固定的实验参数:
_1 = 0.9, _2 = 0.999, = 0.01, = 0.001, = 10^-8
请根据给定的 N 个样本,计算最终的模型参数。
提示:
- 银行家舍入法(Round half to even):舍入到最接近的数值;若与两个数值的距离相等(即需要舍弃的部分恰好为 0.5),则舍入到最近的偶数。

输入输出

输入描述
第一行包含一个整数 N (1 ≤ N ≤ 10^5),代表样本总数。
接下来的 N 行,每行包含三个浮点数 x_1, x_2, y_true (-1000.0 ≤ x_1, x_2, y_true ≤ 1000.0),含义见题目描述。
输出描述
输出一行三个浮点数,分别表示经过 N 次更新后的 w_1, w_2, b 。
结果必须精确到 6 位小数,且使用银行家舍入法(四舍六入五成双)。数值之间用一个空格分隔,末尾不要有多余空格。

样例共 2 组

样例 1 · 在样例中,处理第一个样本后, w_1 约更新为 0.001, w_2 保持为 0, b 约更新为 0.001。接着在此基础上处理第二个样本。
输入
2
2.0 0.0 4.0
0.0 2.0 -2.0
输出
0.001670 -0.000744 0.001266
样例 2 · For sample 1 ( t=1 ): x_1=1.0, x_2=1.0, y_true=2.0 . The parameters are updated from 0 to w_1=0.001, w_2=0.001, b=0.001 . For sample 2 ( t=2 ): x_1=2.0, x_2=2.0, y_true=4.0 . The parameters are updated to w_1 ≈ 0.001884, w_2 ≈ 0.001884, b ≈ 0.001965 . For sample 3 ( t=3 ): x_1=3.0, x_2=3.0, y_true=6.0 . The parameters are updated to the final values.
输入
3
1.0 1.0 2.0
2.0 2.0 4.0
3.0 3.0 6.0
输出
0.002750 0.002750 0.002923

算法解析依据充分

考点:模拟

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

题目画像

  • 数据规模:N ≤ 1e5
  • 元素值域:x_1 ≤ 1e3,x_2 ≤ 1e3,y_true ≤ 1e3(注意整数类型选择,避免溢出)
  • 复杂度门槛:只允许 O(n log n) 及更优,朴素 O(n²) 会超时。
  • 源站时限:2 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:模拟

本题切入点

逐样本执行 AdamW 更新:算梯度 → 更新一阶/二阶矩 → 偏差修正 → 解耦权重衰减并更新参数,最后输出 w1,w2,b 六位小数(银行家舍入)。

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

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

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

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

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

该范式的通法易错点

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

对照本题

  • 数据规模 N ≤ 1e5,只允许 O(n log n) 及更优,朴素 O(n²) 会超时。
  • 元素值域最大到 1e3 —— 求和 / 相乘时记得开 64 位整数。

题目给出的提示

  • - 银行家舍入法(Round half to even):舍入到最接近的数值;若与两个数值的距离相等(即需要舍弃的部分恰好为 0.5),则舍入到最近的偶数

样例解读

样例 1:输入 2 / 2.0 0.0 4.0 / 0.0 2.0 -2.0 → 输出 0.001670 -0.000744 0.001266

在样例中,处理第一个样本后, w_1 约更新为 0.001, w_2 保持为 0, b 约更新为 0.001。接着在此基础上处理第二个样本。

样例 2:输入 3 / 1.0 1.0 2.0 / 2.0 2.0 4.0 / 3.0 3.0 6.0 → 输出 0.002750 0.002750 0.002923

For sample 1 ( t=1 ): x_1=1.0, x_2=1.0, y_true=2.0 . The parameters are updated from 0 to w_1=0.001, w_2=0.001, b=0.001 .

For sample 2 ( t=2 ): x_1=2.0, x_2=2.0, y_true=4.0 . The parameters are updated to w_1 ≈ 0.001884, w_2 ≈ 0.001884, b ≈ 0.001965 .

For sample 3 ( t=3 ): x_1=3.0, x_2=3.0, y_true=6.0 . The parameters are updated to the final values.

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

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

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