1 条题解
-
0
#3333. 「BalticOI 2020」混合物 题解
问题分析
我们需要判断能否用给定的调味瓶混合出目标比例 ,并求出所需的最少瓶数。
关键观察
- 比例等价性:目标 与 对于任意 是等价的
- 线性组合:混合调味瓶相当于做线性组合
- 降维处理:三维比例可以降到二维
数学建模
1. 比例归一化
将目标向量和每个调味瓶向量投影到二维空间:
令目标向量为
对于每个调味瓶 ,我们考虑其在目标向量正交补空间上的投影。
2. 核心思路
定义新的坐标系:
- 将目标向量 作为一个坐标轴
- 找到两个与 线性无关的向量作为另外两个坐标轴
实际上,我们可以将问题转化为:寻找非负系数 (不全为0),使得:
$$\sum c_i \mathbf{v}_i = \alpha \mathbf{v}_f \quad (\alpha > 0) $$这等价于:
$$\sum c_i \left(\mathbf{v}_i - \beta_i \mathbf{v}_f\right) = 0 $$其中 是某个标量。
3. 具体变换方法
令目标向量为 ,调味瓶向量为 。
我们想要判断是否存在非负系数 (不全为0)使得:
$$\frac{\sum \lambda_i s_i}{\sum \lambda_i p_i} = \frac{s_f}{p_f} \quad \text{且} \quad \frac{\sum \lambda_i p_i}{\sum \lambda_i g_i} = \frac{p_f}{g_f} $$这可以通过叉积来检验。定义函数:
$$f(\mathbf{v}) = \mathbf{v} \times \mathbf{v}_f = (p \cdot g_f - g \cdot p_f, g \cdot s_f - s \cdot g_f, s \cdot p_f - p \cdot s_f) $$如果 ,且 与 同向,则达到目标比例。
4. 二维表示
实际上,我们可以将三维向量投影到二维:
令:
$$x_i = \frac{s_i}{s_f} - \frac{g_i}{g_f}, \quad y_i = \frac{p_i}{p_f} - \frac{g_i}{g_f} $$那么目标是在 平面上找到最少的向量,使得它们的凸包包含原点。
算法设计
1. 凸包方法
将每个调味瓶表示为二维点 ,问题转化为:
找到包含原点的最少点的凸包
2. 动态维护
由于调味瓶会动态添加和删除,我们需要动态维护这些点,并快速回答包含原点的最小凸包大小。
3. 极角排序
将所有点按极角排序,维护两个指针扫描,找到包含原点的最小点集。
复杂度分析
- 每次查询: 或 ,其中 是当前调味瓶数量
- 对于 ,需要优化
- 1
信息
- ID
- 3274
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 5
- 已通过
- 1
- 上传者