zoukankan      html  css  js  c++  java
  • Codeforces 954E Water Taps

    题目大意

    有 $n$($1le nle 200000$)个变量 $x_1, x_2, dots, x_n$,满足
    egin{equation}
    0le x_i le a_i label{C:0}
    end{equation}
    其中 $1le a_i le 10^6$,$a_iinmathbb Z$ 。

    给定常数 $T$($1le Tinmathbb Zle 10^6$)以及常数 $t_1, t_2, dots, t_n$($1le t_iinmathbb Zle 10^6$),求解下述最优化问题
    egin{align}
    max sum_{1le ile n} x_iquad mathrm{s.t.} label{sum} \
    frac{sum_{1le ile n}x_it_i}{sum_{1le ile n}x_i} = T label{C:1}
    end{align}
    若无解则输出 0 。

    解法

    比赛时我毫无思路,想不起来从前遇没遇到过类似的题目。

    首先将 eqref{C:1} 化为
    egin{equation}
    sum_{1le ile 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$ 的正负性分成两组分别考虑,二者是“无关”的。

    具体而言,设
    egin{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 0le S le S_{mathrm{min}}$,$exists x_1, x_2, dots, x_i, dots, x_n$ 满足 eqref{C:0} 且满足
    egin{align*}
    sum_{t_i -T > 0} (t_i - T) x_i = S \
    sum_{t_i - T<0} (T-t_i) x_i = S
    end{align*}

    不难看出,取 $S = S_{mathrm{min}}$ 可使 eqref{sum} 最大。
    这题实际上是一道贪心问题。

    推广

    把 eqref{C:1} 的分子分母中的 $x_i$ 都换成 $x_i^2$ 也是一样的做法。
    但是若只把分母或分子中的 $x_i$ 换成 $x_i^2$ 改怎么做呢?

  • 相关阅读:
    程序打包(通过VS2015插件 InstallShield2015 Limited Edition 方式)
    QSS单独设置四个边角
    Qt 设置窗口圆角
    Qt实现鼠标拖动窗口
    关于split切割的几种情况
    java开发过程中,报错Dangling meta character '*' near index 0,解决办法
    关于ArrayList的contains方法
    WPS文档按回车键不能换行怎么解决
    正则表达式截取数字
    如何用hibernate中查询出一个表数量总数
  • 原文地址:https://www.cnblogs.com/Patt/p/8627212.html
Copyright © 2011-2022 走看看