acwing-348. 沙漠之王
考点
- 最小生成树
- 01分数规划
- 二分
题解
1 |
|
思路
01分数规划的模板题。
题意是说有n
个点,每个点有(x, y, z)
三个属性,(x, y)
代表该点坐标,z
代表该点高度,
两点i
和j
之间的欧氏距离保存到b[i][j]
,开销等于abs(zi - zj)
保存到a[i][j]
,点间两两都存在无向边。
设第i
条边的开销等于ai
,距离等于bi
,选任意n - 1
条边作为生成树,找出下列式子的最小值:
\[
\frac{\sum_{i=1}^n{a_i\cdot x_i}}{\sum_{i=1}^n{b_i\cdot
x_i}}\text{,其中}x_i\in \left\{ 0,1 \right\}
\] 使用实数二分进行求解。
假设当前有mid
小于等于答案ans
,由于答案是式子的最小值,你比最小值都小,那么对于任意x
都有下式成立:
\[
mid\leqslant ans=\frac{\sum{\begin{array}{c}
n\\
i=1\\
\end{array}a_ix_i}}{\sum{\begin{array}{c}
n\\
i=1\\
\end{array}b_ix_i}}\Longrightarrow \sum{\begin{array}{c}
n\\
i=1\\
\end{array}x_i\cdot \left( mid\cdot b_i-a_i \right)}\leqslant
0\text{,对任意}x\text{成立}
\]
如果mid
大于答案ans
,ans
只是最小值,只大于最小值并不能说明式子其他解的情况,只能说存在x
有下式成立:
\[
mid>ans=\frac{\sum{\begin{array}{c}
n\\
i=1\\
\end{array}a_ix_i}}{\sum{\begin{array}{c}
n\\
i=1\\
\end{array}b_ix_i}}\Longrightarrow \sum{\begin{array}{c}
n\\
i=1\\
\end{array}x_i\cdot \left( mid\cdot b_i-a_i
\right)}>0\text{,存在}x\text{成立}
\] 把上面式子的正负号修改后,整理如下: \[
\begin{cases}
mid\leqslant ans\text{时,有}\sum{\begin{array}{c}
n\\
i=1\\
\end{array}x_i\cdot \left( a_i-mid\cdot b_i \right)}\geqslant
0\text{,任意}x\text{成立}\\
mid>ans\text{时,有}\sum{\begin{array}{c}
n\\
i=1\\
\end{array}x_i\cdot \left( a_i-mid\cdot b_i
\right)}<0\text{,存在}x\text{成立}\\
\end{cases}
\]
对上述不等式左侧求最小值min
即可,也就是最小生成树:
min >= 0
,说明mid <= ans
,mid
不够大,那么mid
向右边界移动min < 0
,说明mid > ans
,mid
大于答案,那么mid
向左边界移动- 最后返回左边界
l
,因为求的是符合条件中的更小值