题目大意

有 $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{align*}

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

推广

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

Codeforces 954E Water Taps的更多相关文章

  1. Codeforces 954 E. Water Taps

    http://codeforces.com/problemset/problem/954/E 式子变成Σ xi*(ti-T)=0 sum0表示>=T的ai*ti之和 sum1表示<T的ai ...

  2. Codeforces 343D Water Tree 分类: Brush Mode 2014-10-05 14:38 98人阅读 评论(0) 收藏

    Mad scientist Mike has constructed a rooted tree, which consists of n vertices. Each vertex is a res ...

  3. CodeForces 343D water tree(树链剖分)

    Mad scientist Mike has constructed a rooted tree, which consists of n vertices. Each vertex is a res ...

  4. Codeforces 343D Water Tree(DFS序 + 线段树)

    题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...

  5. Codeforces 343D Water Tree

    题意简述 维护一棵树,支持以下操作: 0 v:将以v为跟的子树赋值为1 1 v:将v到根节点的路径赋值为0 2 v:询问v的值 题解思路 树剖+珂朵莉树 代码 #include <set> ...

  6. Codeforces 343D Water Tree & 树链剖分教程

    原题链接 题目大意 给定一棵根为1,初始时所有节点值为0的树,进行以下三个操作: 将以某点为根的子树节点值都变为1 将某个节点及其祖先的值都变为0 *询问某个节点的值 解题思路 这是一道裸的树链剖分题 ...

  7. Codeforces 1300E. Water Balance

    给你一个数列,有一个操作,将一段数字变成其和除以个数,求字典序最小的那一个,分析知,求字典序最小,就是求一个不下降序列,但我们此时有可以更改数字的操作,已知已经不下降的序列不会因为操作而变的更小,只有 ...

  8. Educational Codeforces Round 40 (Rated for Div. 2) Solution

    从这里开始 小结 题目列表 Problem A Diagonal Walking Problem B String Typing Problem C Matrix Walk Problem D Fig ...

  9. Codeforces Educational Round 37

    Solved   CodeForces 920A Water The Garden   Solved   CodeForces 920B Tea Queue   Solved   CodeForces ...

随机推荐

  1. 阿里云服务器下安装LAMP环境(CentOS Linux 6.3) 安装与配置 php

    下面我们一起为服务器安装 PHP,在使用 yum 安装软件包的时候,yum 会去默认的资源库里查看我们要安装的软件包,然后到指定的服务器上下载并安装. 但是有的时候,我们要安装的软件包并没有包含在默认 ...

  2. java设计模式——单例模式(二)

     破坏单例模式 上一章节,介绍了单例模式的几种方式,这次来学习一波我们创建的单例模式是否安全,能不能破坏.换句话说,也就是在程序运行中,不止有一个实例. 一. 序列化,反序列化破坏 以饿汉式的单例模式 ...

  3. 操作AD时出现 Access denied error

    CommitChanges General Access denied error in Active Directory 1.首先检查AD账户是否具有操作AD的访问权限 2.若用C#类操作AD,还要 ...

  4. head与body(新手向)

    网页文档包含了页头(head)与主体(body) 页头 -是对该网页文档进行描绘的主体信息. -至少含有title与meta. meta描述网页的特征,比如字符编码,平时广泛用的utf-8.且meta ...

  5. Load事件中控件Focus()无效解决办法

    原因:Load窗体时,窗体未显示 解决:1.Focus()之前添加this.Show(); 2.在Shown事件中添加Focus()

  6. 通过LDB_PROCESS函数使用逻辑数据库

    1.概览    通过LDB_PROCESS函数可以允许任何程序访问逻辑数据库,允许一个程序访问多个逻辑数据库,当然也允许多次连续访问访问同个逻辑数据库.当使用LDB_PROCESS函数来访问逻辑数据库 ...

  7. 【Python学习之十】yield之send方法

    yield作用 简单地讲,yield 的作用就是把一个函数变成一个 generator,带有 yield 的函数不再是一个普通函数,Python 解释器会将其视为一个 generator.下面以斐波拉 ...

  8. Linux 服务器用户权限管理改造方案与实施项目

    Linux 服务器用户权限管理改造方案与实施项目 在了解公司业务流程后,提出权限整改方案改进公司超级权限root泛滥的现状. 我首先撰写方案后,给boss看,取得boss的支持后,召集大家开会讨论. ...

  9. RNN教程之-2 LSTM实战

    前言 说出来你们不敢相信,刚才码了半天的字,一个侧滑妈的全没了,都怪这Mac的触摸板太敏感沃日.好吧,不浪费时间了,前言一般都是废话,这个教程要解决的是一个LSTM的实战问题,很多人问我RNN是啥,有 ...

  10. 搭建Data Mining环境(Spark版本)

    前言:工欲善其事,必先利其器.倘若不懂得构建一套大数据挖掘环境,何来谈Data Mining!何来领悟“Data Mining Engineer”中的工程二字!也仅仅是在做数据分析相关的事罢了!此文来 ...