Codeforces 954E Water Taps
题目大意
有 \(n\)(\(1\le n\le 200000\))个变量 \(x_1, x_2, \dots, x_n\),满足
\begin{equation}
0\le x_i \le a_i \label{C:0}
\end{equation}
其中 \(1\le a_i \le 10^6\),\(a_i\in\mathbb Z\) 。
给定常数 \(T\)(\(1\le T\in\mathbb Z\le 10^6\))以及常数 \(t_1, t_2, \dots, t_n\)(\(1\le t_i\in\mathbb Z\le 10^6\)),求解下述最优化问题
\begin{align}
\max \sum_{1\le i\le n} x_i\quad \mathrm{s.t.} \label{sum} \\
\frac{\sum_{1\le i\le n}x_it_i}{\sum_{1\le i\le n}x_i} = T \label{C:1}
\end{align}
若无解则输出 0 。
解法
比赛时我毫无思路,想不起来从前遇没遇到过类似的题目。
首先将 \eqref{C:1} 化为
\begin{equation}
\sum_{1\le i\le n} (t_i - T) x_i = 0 \label{C:2}
\end{equation}
将约束条件写成这种形式,保证了新问题与原问题完全等价。(换言之,包含了无解—即 \eqref{C:1} 无法满足—的情况)
下面的讨论都基于 \eqref{C:2} 式。
这个问题不必【也不可能?(\(n\) 太大)】用线性规划求解。
key observation 是
\eqref{C:2} 中的各项可以按系数 \(t_i -T\) 的正负性分成两组分别考虑,二者是“无关”的。
具体而言,设
\begin{align}
S_+&=\sum_{t_i-T>0}(t_i-T) a_i \\
S_-&= \sum_{t_i - T < 0}(T-t_i) a_i \\
S_{\mathrm{min}} &= \min\{S_+\,, S_-\}
\end{align}
我们有
\(\forall 0\le S \le S_{\mathrm{min}}\),\(\exists x_1, x_2, \dots, x_i, \dots, x_n\) 满足 \eqref{C:0} 且满足
\begin{align*}
\sum_{t_i -T > 0} (t_i - T) x_i = S \\
\sum_{t_i - T<0} (T-t_i) x_i = S
\end
不难看出,取 \(S = S_{\mathrm{min}}\) 可使 \eqref{sum} 最大。
这题实际上是一道贪心问题。
推广
把 \eqref{C:1} 的分子分母中的 \(x_i\) 都换成 \(x_i^2\) 也是一样的做法。
但是若只把分母或分子中的 \(x_i\) 换成 \(x_i^2\) 改怎么做呢?