大厂真题 / 华为
华为 4.15 笔试真题 - AI岗
本场考试概述
考试时间:2026年4月15日 考试岗位:AI岗(国内) 难度评级:中等
考点分析:
- 选择题(20道):数学(线代/概率统计/数值计算)、机器学习(K-Means/特征工程/评价指标)、深度学习(优化器/Softmax/基础概念/分布式训练)、大模型(RAG/长上下文评测/SmoothQuant量化)
- 第一题:AdamW 优化器实现(难度中等)——手写优化器逐样本迭代
- 第二题:贪心分配(难度中等)——经典 Candy 问题变体,两次遍历贪心
建议策略:
- 选择题覆盖面广,分布式训练(DDP All-Reduce)、SmoothQuant 量化、互信息、Newton-Schulz 迭代是高频考点,注意多选题
- 第一题吃透 AdamW 四个步骤:梯度 → 动量更新 → 偏差修正 → 权重衰减更新,注意银行家舍入
- 第二题识别出”相邻比较、满足双侧约束”就是 Candy 模型,两次遍历即可
选择题(20道)
第1题
在标准的数据并行(DDP)训练过程中,每个 GPU 独立计算梯度后,为保持模型权重一致,需要在每次迭代结束时执行什么通信操作?
A. Broadcast B. All-Gather C. Send/Recv D. All-Reduce
答案:D
考点:深度学习——分布式训练
DDP 中每个 GPU 独立前向+反向得到本地梯度,迭代结束时通过 All-Reduce 将所有 GPU 的梯度求和/平均后广播回每张卡,从而保证各卡参数一致。Broadcast 是单源广播,All-Gather 是拼接而非聚合,Send/Recv 是点对点通信,均不符合”梯度同步”的语义。
第2题
在使用 K-Means 算法进行聚类之前,用户必须预先指定的关键参数是?
A. 聚类中心的初始坐标 B. 聚类的数量 $K$ C. 数据的密度阈值 D. 学习率
答案:B
考点:机器学习——K-Means
K-Means 的核心超参数是聚类数 $K$,必须在运行前指定。初始坐标通常由算法(如 K-Means++)自动选取,密度阈值属于 DBSCAN,学习率与 K-Means 无关。
第3题
设数据矩阵 $X \in \mathbb{R}^{n \times d}$。若对数据进行线性映射 $Y = XW$,其中 $W \in \mathbb{R}^{d \times k}$,则新的数据矩阵 $Y$ 的维度为:
A. $d \times k$ B. $n \times k$ C. $k \times n$ D. $d \times n$
答案:B
考点:数学——线性代数
矩阵乘法维度规则:$(n \times d) \cdot (d \times k)$,内维 $d$ 消去,结果维度为 $n \times k$。
第4题
给定输入向量为 $[1, 1, 1]$,经过标准 Softmax 函数处理后,输出的向量结果是多少?
A. $[1, 1, 1]$ B. $[0.5, 0.5, 0.5]$ C. $[0, 0, 1]$ D. $[\frac{1}{3}, \frac{1}{3}, \frac{1}{3}]$
答案:D
考点:深度学习——Softmax
Softmax 将每个元素映射为 $\frac{e^{z_i}}{\sum_j e^{z_j}}$。三个输入相同时,$e^1 / (3 \cdot e^1) = 1/3$,因此输出为 $[1/3, 1/3, 1/3]$。Softmax 输出之和为 1,排除 A(和为 3)和 B(和为 1.5)。
第5题
K-Means 算法在迭代过程中,衡量样本点归属的核心准则是?
A. 到质心的欧氏距离最小 B. 样本点范围的密度最大 C. 样本点间的余弦相似度 D. 连通性
答案:A
考点:机器学习——K-Means
K-Means 在 E 步中将每个样本分配给欧氏距离最近的质心,M 步更新质心为簇内均值。密度最大是 DBSCAN 的思想,余弦相似度和连通性不是 K-Means 的度量方式。
第6题
在特征工程中,以下哪项操作通常用于减少特征维度并保留主要信息?
A. 特征降维 B. 特征选择 C. 特征编码 D. 特征缩放
答案:A
考点:机器学习——特征工程
特征降维(如 PCA)通过线性/非线性变换将高维特征映射到低维空间,同时尽量保留主要信息。特征选择是挑选子集而非变换维度,特征编码是类别→数值转换,特征缩放是归一化/标准化,均不涉及”降维并保留信息”。
第7题
在一个极简的检索增强生成(RAG)系统中,用户查询 $q = [1, 2, 1]$。向量数据库中存储了两个文档嵌入 $d_1 = [2, 1, 0]$ 和 $d_2 = [1, 0, 2]$。系统使用最大内积搜索(MIPS)召回最相关的文档。请计算内积得分,并判断系统会召回哪个文档以及对应的得分是多少?
A. 召回 $d_1$,得分为 4 B. 召回 $d_2$,得分为 4 C. 召回 $d_1$,得分为 3 D. 召回 $d_2$,得分为 5
答案:A
考点:大模型——RAG
$q \cdot d_1 = 1 \times 2 + 2 \times 1 + 1 \times 0 = 4$,$q \cdot d_2 = 1 \times 1 + 2 \times 0 + 1 \times 2 = 3$。MIPS 选内积最大的文档,$4 > 3$,因此召回 $d_1$,得分为 4。
第8题
设样本 $x_1, x_2, \ldots, x_n$ 来自正态总体 $N(\mu, \sigma^2)$,$\mu$ 未知、$\sigma^2$ 已知,若似然函数 $L(\mu) = \prod_{i=1}^{n} \frac{1}{\sqrt{2\pi}\sigma} \exp!\left(-\frac{(x_i - \mu)^2}{2\sigma^2}\right)$,则使 $L$ 最大的 $\hat{\mu}$ 满足
A. $\hat{\mu} = \frac{1}{n}\sum_{i=1}^n x_i^2$ B. $\hat{\mu} = \frac{\sum x_i^2}{\sum x_i}$ C. $\hat{\mu} = \text{median}(x_1, \ldots, x_n)$ D. $\hat{\mu} = \bar{x} = \frac{1}{n}\sum_{i=1}^n x_i$
答案:D
考点:数学——概率统计
要最大化 $L$,等价于最小化指数上的 $\sum(x_i - \mu)^2$。对 $\mu$ 求导并令其为零:$\sum 2(x_i - \mu) = 0$,即 $\sum x_i = n\mu$,解得 $\hat{\mu} = \bar{x} = \frac{1}{n}\sum x_i$(样本均值),这正是正态分布均值的最大似然估计。
第9题
线性回归中关于 $R^2$(决定系数),下列说法正确的是
A. 增加无关特征会使 $R^2$ 降低 B. $R^2$ 是衡量模型对数据拟合优度的核心指标,取值范围 $[0, 1]$ C. $R^2$ 可以用于比较不同数据集上模型的优劣 D. $R^2$ 越接近 0,模型拟合越好
答案:B
考点:机器学习——评价指标
$R^2 = 1 - \frac{SS_{\text{res}}}{SS_{\text{tot}}}$,衡量模型解释方差的比例,取值 $[0, 1]$,越接近 1 拟合越好。增加特征(哪怕无关)$R^2$ 只会不降(所以有调整 $R^2_{\text{adj}}$),A 错;$R^2$ 依赖数据分布,不同数据集间不可直接比较,C 错;D 说反了。
第10题
评测长上下文能力时,为避免模型靠”猜测/泛化”蒙对,常见的高质量题型设计是?
A. 在长文中埋入多个相似实体/数值,要求定位并做跨段整合(needle/multi-hop) B. 提问”这段话大意是什么” C. 把短文重复 10 遍凑成长文 D. 测模型能输出多少 token
答案:A
考点:大模型——评测方法
Needle-in-a-haystack 和 multi-hop 题型在长文中埋入多个相似但不同的细节,要求模型精确定位并整合跨段信息,无法靠泛化蒙对。B 只考摘要能力,C 重复文本无法测真正的长上下文理解,D 测的是生成长度而非理解能力。
第11题
在特征选择(Feature Selection)过程中,当我们怀疑特征 $X$ 与目标变量 $Y$ 之间存在复杂的非线性相关性(例如 $y = x^2$ 或周期性关系),且 $X$ 并不服从正态分布时,下列哪种指标最为准确且稳健?
A. 斯皮尔曼等级相关系数(Spearman’s Rank Correlation):利用变量的秩次进行线性相关性分析 B. 方差分析(ANOVA F-value):通过比较组间方差与组内方差的比值来检验均值差异 C. 皮尔逊相关系数(Pearson Correlation Coefficient):通过计算协方差与标准差的比值来衡量相关性 D. 互信息(Mutual Information, MI):基于信息熵理论,衡量已知 $X$ 的情况下 $Y$ 不确定性的减少程度
答案:D
考点:机器学习——特征工程
互信息(MI)不假设线性关系也不要求正态分布,能捕获任意形式的统计依赖,适合非线性、非正态场景。Pearson 和 Spearman 本质上衡量的是单调/线性关系,对 $y = x^2$ 这类对称非单调关系会给出接近 0 的值。ANOVA 适用于分类变量与连续变量之间的关系检验,不适合连续-连续的非线性依赖。
第12题
矩阵奇异值分解(SVD)无法直接应用于以下哪个场景?
A. 图像去噪 B. 决策树分类 C. 文本主题建模 D. 推荐系统中用户-电影评分矩阵降维
答案:B
考点:数学——线性代数
SVD 可用于图像去噪(低秩近似)、文本主题建模(LSA/LSI)、推荐系统(矩阵分解)。决策树基于特征阈值递归划分,不涉及矩阵分解操作,SVD 无法直接应用。
第13题
SmoothQuant 是一种常用的大模型量化方法,它的核心思想是?
A. 将权重 scale 转移到 activation B. 将 activation scale 转移到权重 C. 减少层数 D. 减少 batch
答案:B
考点:大模型——量化
SmoothQuant 的核心观察是 activation 的离群值比权重更难量化。它通过一个逐通道的平滑因子,将 activation 中的大 scale 数学等价地迁移到权重上,使 activation 分布更平滑、更易量化,同时权重稍微变难但仍可接受,从而实现高效的 W8A8 量化。
第14题
实数矩阵 $A$ 的零空间(Null Space)是指?
A. 与列空间正交的空间 B. 矩阵的列向量张成的空间 C. 满足 $Ax = 0$ 的所有 $x$ 构成的空间 D. 矩阵的行向量张成的空间
答案:C
考点:数学——线性代数
零空间(Null Space)即核空间,定义为所有满足 $Ax = 0$ 的向量 $x$ 构成的子空间。A 描述的是左零空间(与列空间正交的是左零空间,与行空间正交的才是零空间),B 是列空间,D 是行空间。
第15题
神经网络相比线性模型的优势在于
A. 参数更少 B. 不需要激活函数 C. 计算更简单 D. 可以学习非线性关系
答案:D
考点:深度学习——基础概念
神经网络通过激活函数引入非线性,能拟合复杂的非线性映射,这是其相比线性模型的核心优势。神经网络参数通常更多(A 错)、依赖激活函数(B 错)、计算更复杂(C 错)。
第16题(多选)
并非所有图形计算单元都支持矩阵求逆算子,若不支持,可使用 Newton-Schulz 迭代法。设非奇异矩阵 $A$,使用 Newton-Schulz 迭代计算 $A^{-1}$:$X_{k+1} = X_k(2I - AX_k)$。记误差矩阵为 $E_k = I - AX_k$,下列说法正确的是?
A. 若 $|E_0| < 1$,则迭代二次收敛到 $A^{-1}$,且误差满足 $E_{k+1} = E_k^2$ B. 若谱半径 $\rho(E_0) < 1$,则迭代收敛到 $A^{-1}$ C. 如果 $A$ 可逆,那么该迭代方法对初值不敏感 D. 误差满足 $E_{k+1} = E_k^3$,收敛阶为 3
答案:A, B
考点:数学——数值计算
由递推式可得 $E_{k+1} = I - AX_{k+1} = I - AX_k(2I - AX_k) = (I - AX_k)^2 = E_k^2$,即误差矩阵满足 $E_{k+1} = E_k^2$(二次收敛,非三次,D 错)。当 $|E_0| < 1$ 时,$|E_k| \to 0$,A 正确。谱半径 $\rho(E_0) < 1$ 保证 $E_k^{2^k} \to 0$,B 正确。收敛条件要求初值使得 $|E_0| < 1$,初值选取至关重要,C 错。
第17题(多选)
下面哪些优化器属于”自适应学习率(按参数/维度自适应缩放)”方法?
A. SGD B. Adam C. AdamW D. RMSprop
答案:B, C, D
考点:深度学习——优化器
Adam、AdamW、RMSprop 都维护梯度二阶矩的移动平均,用其对每个参数的学习率进行自适应缩放。SGD 对所有参数使用统一的全局学习率,不具备自适应特性。AdamW 是 Adam 的解耦权重衰减变体,自适应机制不变。
第18题(多选)
关于神经网络的层,以下哪些说法是正确的?
A. 输入层通常不进行计算,只是传递数据 B. 顶层可以有多个 C. 输出层的神经元数量通常由任务决定(如分类类别数) D. 所有层的神经元数量必须相同
答案:A, B, C
考点:深度学习——基础概念
输入层仅传递原始特征,不含可训练参数,A 正确。多任务学习或多输出网络可以有多个输出头(顶层),B 正确。输出层神经元数由任务决定(二分类 1 个、多分类 $C$ 个、回归 1 个),C 正确。各层神经元数量可以不同,这正是网络架构设计的自由度,D 错误。
第19题(多选)
设 $X$ 和 $Y$ 是两个随机变量,$a$、$b$ 和 $c$ 是常数。以下关于期望性质的说法中,正确的有?
A. $E(XY) = E(X) \cdot E(Y)$ 总是成立 B. $E(X^2) - [E(X)]^2 \geq 0$ 恒成立 C. $E(aX + bY + c) = aE(X) + bE(Y) + c$ D. $[E(X)]^2 \leq E(X^2)$ 恒成立
答案:B, C, D
考点:数学——概率统计
$E(XY) = E(X)E(Y)$ 仅在 $X$、$Y$ 不相关时成立,相关时一般不等,A 错。$E(X^2) - [E(X)]^2 = \text{Var}(X) \geq 0$ 是方差的定义等价形式,恒成立,B 正确。期望的线性性 $E(aX + bY + c) = aE(X) + bE(Y) + c$ 对任意随机变量恒成立(无需独立),C 正确。由 B 可得 $[E(X)]^2 \leq E(X^2)$(Jensen 不等式的特例),D 正确。
第20题(多选)
关于插值多项式的说法,下列哪些是正确的?
A. 插值多项式在节点处的函数值一定等于给定函数值 B. 对于给定的 $n+1$ 个互异节点,次数不超过 $n$ 的插值多项式存在且唯一 C. 高次插值多项式通常能更好地逼近原函数 D. Lagrange 插值法和 Newton 插值法构造的插值多项式是相同的
答案:A, B, D
考点:数学——数值计算
插值条件要求多项式在节点处精确等于给定值,A 正确。$n+1$ 个互异节点唯一确定一个次数不超过 $n$ 的多项式(存在唯一性定理),B 正确。高次插值会出现 Runge 现象(端点附近剧烈振荡),通常不能更好逼近,C 错。Lagrange 和 Newton 只是同一多项式的不同表达形式,结果完全相同,D 正确。
第一题:基于 AdamW 优化的网络带宽预测模型
题目描述
在华为网络通信业务中,网络带宽预测模型为 $y = w_1 x_1 + w_2 x_2 + b$(其中 $y$ 表示带宽,$x$ 为影响带宽的因子,$w$ 为权重参数,$b$ 为偏置参数)。请实现 AdamW 优化算法,基于给定样本数据逐样本迭代更新模型参数。
损失函数:对于单个样本 $(x_1, x_2, y)$,损失 $L = (\hat{y} - y)^2$,其中 $\hat{y} = w_1 x_1 + w_2 x_2 + b$。
AdamW 算法参数:动量参数 $\beta_1 = 0.9$,$\beta_2 = 0.999$,权重衰减系数 $\lambda = 0.01$,学习率 $\alpha = 0.001$,数值稳定性常数 $\varepsilon = 10^{-8}$。
一阶动量更新:$m_t = \beta_1 \cdot m_{t-1} + (1 - \beta_1) \cdot g_t$
二阶动量更新:$v_t = \beta_2 \cdot v_{t-1} + (1 - \beta_2) \cdot g_t^2$
偏差修正:$\hat{m}_t = \frac{m_t}{1 - \beta_1^t}$,$\hat{v}_t = \frac{v_t}{1 - \beta_2^t}$
参数更新:$\theta_t = \theta_{t-1} - \alpha \left( \frac{\hat{m}_t}{\sqrt{\hat{v}_t} + \varepsilon} + \lambda \cdot \theta_{t-1} \right)$
初始参数:$w_1 = w_2 = b = 0$,初始一/二阶动量均为 $0$。
输入 $n$ 个样本,输出最终 $w_1$、$w_2$、$b$,保留 6 位小数,银行家舍入。
样例
输入
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
思路分析
第一步:增广特征统一处理
偏置 $b$ 可以看作”输入恒为 1 的特征”的权重。将 $(w_1, w_2, b)$ 合并为参数向量 $\theta$,输入增广为 $(x_1, x_2, 1)$,预测值写成一次点积 $\hat{y} = \theta \cdot x_{\text{aug}}$。这样三个参数的梯度可以统一计算为 $g = 2 \cdot (\hat{y} - y) \cdot x_{\text{aug}}$,无需分别处理 $w$ 和 $b$。
第二步:AdamW 的四个关键机制
- 一阶动量 $m$:梯度方向的指数滑动平均。$\beta_1 = 0.9$ 意味着当前梯度只占 10% 权重,让更新方向更稳定,不被单个样本的噪声带偏
- 二阶动量 $v$:梯度平方的指数滑动平均,历史梯度越大的参数后续步长自动缩小,防止震荡
- 偏差修正:$m$ 和 $v$ 初始化为零,前几步被零值拖小。除以 $(1 - \beta^t)$ 补偿这一低估,随着 $t$ 增大修正自动消退
- AdamW 权重衰减:$\lambda \cdot \theta$ 项直接缩小参数本身(区别于 L2 正则化中将衰减项混入梯度),防止参数过大
第三步:实现细节
$n$ 个样本逐个处理,每个样本触发一次完整的 AdamW 更新步骤(时间步 $t$ 从 1 到 $n$)。最后输出时需要银行家舍入(四舍六入五成双),Python 的 Decimal 模块 ROUND_HALF_EVEN 可以实现。
以样例为例手算验证第一步:
- $t=1$:$x_{\text{aug}} = [1, 1, 1]$,$\hat{y} = 0$,$\text{err} = -2$,$g = [-4, -4, -4]$
- $m_1 = 0.1 \times [-4, -4, -4] = [-0.4, -0.4, -0.4]$
- $\hat{m}_1 = [-0.4] / (1 - 0.9) = [-4, -4, -4]$
- 这保证了第一步的修正动量等于原始梯度
题解代码
import sys
import numpy as np
from decimal import Decimal, ROUND_HALF_EVEN
input = sys.stdin.readline
n = int(input())
X = np.zeros((n, 2))
Y = np.zeros(n)
for i in range(n):
parts = input().split()
X[i, 0], X[i, 1], Y[i] = float(parts[0]), float(parts[1]), float(parts[2])
beta1, beta2, lam, alpha, eps = 0.9, 0.999, 0.01, 0.001, 1e-8
# theta = [w1, w2, b],增广特征 [x1, x2, 1]
theta = np.zeros(3)
m = np.zeros(3)
v = np.zeros(3)
for t_idx in range(n):
x_aug = np.array([X[t_idx, 0], X[t_idx, 1], 1.0])
y_pred = theta @ x_aug
err = y_pred - Y[t_idx]
# 梯度 dL/d(theta) = 2 * (y_pred - y) * x_aug
g = 2 * err * x_aug
t = t_idx + 1
# 一阶动量:梯度方向的指数滑动平均
m = beta1 * m + (1 - beta1) * g
# 二阶动量:梯度平方的指数滑动平均
v = beta2 * v + (1 - beta2) * g ** 2
# 偏差修正:补偿零初始化带来的低估
m_hat = m / (1 - beta1 ** t)
v_hat = v / (1 - beta2 ** t)
# AdamW参数更新:权重衰减直接作用于参数
theta = theta - alpha * (m_hat / (np.sqrt(v_hat) + eps) + lam * theta)
def fmt(x):
return format(Decimal(str(x)).quantize(Decimal("0.000001"), rounding=ROUND_HALF_EVEN), 'f')
print(f"{fmt(theta[0])} {fmt(theta[1])} {fmt(theta[2])}")
复杂度分析
时间复杂度:$O(n \cdot d)$,$d = 3$ 为参数个数,每个样本做常数次向量运算。 空间复杂度:$O(n \cdot d)$,存储样本数据和优化器状态。
第二题:大模型推理资源的最低成本分发
题目描述
有 $n$ 个推理请求任务排成一列,每个任务有一个优先级分值。要求对每个有效任务(优先级 $> 0$)分配推理资源:
- 每个任务至少分配 1 千个 token
- 相邻两个有效任务中,优先级更高的必须获得更多 token
- 优先级 $\leq 0$ 或为空的任务需要被放弃,其相邻任务不与该任务进行优先级比较
求消耗的最少 token 总数(千个 token)。
样例
输入
4,2,6
输出
5
样例解释:分别给第一、二、三个任务分发 2 千、1 千、2 千个 token。第二个任务优先级最低所以只给 1,第一和第三个任务都比第二个大所以至少给 2,总计 5。
思路分析
第一步:识别经典模型——Candy 问题
题目的约束是”每人至少 1 个,相邻两人中得分高的必须分得更多”,这正是 LeetCode 135. Candy 的经典模型。区别在于优先级 $\leq 0$ 的任务要跳过,它们会把序列切断成独立的段。
第二步:预处理分段
遍历优先级数组,遇到 $\leq 0$ 的元素就切断,将有效元素分割成若干连续段。每段内部独立求解后累加。
第三步:两次遍历贪心
每个位置的 token 只受左右两个邻居约束。关键洞察:只要分别满足”比左邻大”和”比右邻大”两个单侧约束,就能同时满足双侧约束。
- 初始化:所有位置 token 设为 1(满足”至少 1 千 token”的下限)
- 左到右遍历:如果当前位置优先级严格大于左邻,则 $\text{token}[i] = \text{token}[i-1] + 1$(保证比左边大)
- 右到左遍历:如果当前位置优先级严格大于右邻,则 $\text{token}[i] = \max(\text{token}[i],\; \text{token}[i+1] + 1)$(取 max 是因为左到右已建立的约束不能破坏,只能往上补)
以样例 [4, 2, 6] 为例:
- 初始化:
[1, 1, 1] - 左到右:4>2? 否;2<6? 是 →
token[2] = token[1]+1 = 2,结果[1, 1, 2] - 右到左:6>2? 否(已经在右边了);2<4? 是 →
token[0] = max(1, 1+1) = 2,结果[2, 1, 2] - 总计 = 5 ✓
题解代码
import sys
input = sys.stdin.readline
line = input().strip()
priorities = [int(x) for x in line.split(',')]
# 按无效任务(≤0)分段,每段独立做 Candy 算法
segments = []
cur = []
for p in priorities:
if p > 0:
cur.append(p)
else:
if cur:
segments.append(cur)
cur = []
if cur:
segments.append(cur)
total = 0
for seg in segments:
n = len(seg)
tokens = [1] * n
# 左到右:比左邻优先级高则多给一个 token
for i in range(1, n):
if seg[i] > seg[i - 1]:
tokens[i] = tokens[i - 1] + 1
# 右到左:比右邻优先级高则取更大值
for i in range(n - 2, -1, -1):
if seg[i] > seg[i + 1]:
tokens[i] = max(tokens[i], tokens[i + 1] + 1)
total += sum(tokens)
print(total)
复杂度分析
时间复杂度:$O(n)$,分割和两次遍历各 $O(n)$。 空间复杂度:$O(n)$,存储每个位置的 token 分配。
小结
- 选择题覆盖面广,20 道题横跨数学(线代/概率统计/数值计算)、机器学习(K-Means/特征工程/评价指标)、深度学习(优化器/Softmax/分布式训练)、大模型(RAG/SmoothQuant/长上下文评测)四大板块。多选题集中在数值计算(Newton-Schulz 迭代)、优化器分类、概率统计性质和插值多项式,需要理解底层原理才能全对。
- 第一题是 ML 编程题的常客——手写优化器。核心是把 AdamW 的四步公式正确实现:一阶动量(稳定方向)→ 二阶动量(自适应步长)→ 偏差修正(补偿零初始化)→ 权重衰减更新。增广特征技巧将 $w$ 和 $b$ 统一为 $\theta$,梯度一次点积搞定。
- 第二题是经典 Candy 问题的变体,关键转化是:无效任务将序列切断为独立段,段内用两次遍历贪心——左到右保证比左邻大,右到左保证比右邻大,取 max 保证双侧约束同时满足。