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{align*}
不难看出,取 $S = S_{\mathrm{min}}$ 可使 \eqref{sum} 最大。
这题实际上是一道贪心问题。
推广
把 \eqref{C:1} 的分子分母中的 $x_i$ 都换成 $x_i^2$ 也是一样的做法。
但是若只把分母或分子中的 $x_i$ 换成 $x_i^2$ 改怎么做呢?
Codeforces 954E Water Taps的更多相关文章
- Codeforces 954 E. Water Taps
http://codeforces.com/problemset/problem/954/E 式子变成Σ xi*(ti-T)=0 sum0表示>=T的ai*ti之和 sum1表示<T的ai ...
- 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 ...
- CodeForces 343D water tree(树链剖分)
Mad scientist Mike has constructed a rooted tree, which consists of n vertices. Each vertex is a res ...
- Codeforces 343D Water Tree(DFS序 + 线段树)
题目大概说给一棵树,进行以下3个操作:把某结点为根的子树中各个结点值设为1.把某结点以及其各个祖先值设为0.询问某结点的值. 对于第一个操作就是经典的DFS序+线段树了.而对于第二个操作,考虑再维护一 ...
- Codeforces 343D Water Tree
题意简述 维护一棵树,支持以下操作: 0 v:将以v为跟的子树赋值为1 1 v:将v到根节点的路径赋值为0 2 v:询问v的值 题解思路 树剖+珂朵莉树 代码 #include <set> ...
- Codeforces 343D Water Tree & 树链剖分教程
原题链接 题目大意 给定一棵根为1,初始时所有节点值为0的树,进行以下三个操作: 将以某点为根的子树节点值都变为1 将某个节点及其祖先的值都变为0 *询问某个节点的值 解题思路 这是一道裸的树链剖分题 ...
- Codeforces 1300E. Water Balance
给你一个数列,有一个操作,将一段数字变成其和除以个数,求字典序最小的那一个,分析知,求字典序最小,就是求一个不下降序列,但我们此时有可以更改数字的操作,已知已经不下降的序列不会因为操作而变的更小,只有 ...
- Educational Codeforces Round 40 (Rated for Div. 2) Solution
从这里开始 小结 题目列表 Problem A Diagonal Walking Problem B String Typing Problem C Matrix Walk Problem D Fig ...
- Codeforces Educational Round 37
Solved CodeForces 920A Water The Garden Solved CodeForces 920B Tea Queue Solved CodeForces ...
随机推荐
- Linux常用的200个命令总结分类
●目录操作命令(6 个) ls tree pwd mkdir rmdir cd ●文件操作命令(7 个) touch cp mv rm ln find rename ●文件查看及处理命令(21 ...
- Python 之继承
概要 如果要修改现有类的行为,我们不必再从头建一个新的类,可以直接利用继承这一功能.下面将以实例相结合介绍继承的用法. 新建一个基类 代码如下: class Marvel(object): num ...
- 记一次加密算法MD5
通过MessageDigest可以获取到16个字节数组: MessageDigest md5 = MessageDigest.getInstance("MD5"); byte[] ...
- C#的接口基础教程之三 定义接口成员
接口可以包含一个和多个成员,这些成员可以是方法.属性.索引指示器和事件,但不能是常量.域.操作符.构造函数或析构函数,而且不能包含任何静态成员.接口定义创建新的定义空间,并且接口定义直 接包含的接口成 ...
- 详解JVM工作原理和特点
在我们运行和调试Java程序的时候,经常会提到一个JVM的概念.本文将为大家讲解JVM工作原理和特点,希望对大家有所帮助. AD:网+线下沙龙 | 移动APP模式创新:给你一个做APP的理由>& ...
- JavaScript 常用的排序算法
冒泡排序 function bubbleSort(array) { for (let i = 0; i < array.length; i++) for (let j = 0; j < a ...
- 已解决: mybatis报错 org.apache.ibatis.reflection.ReflectionException: There is no getter for property named 'xxx' in 'class java.lang.String'
最近在练习MyBatis时 进行姓名的模糊查询时候出现 org.apache.ibatis.exceptions.PersistenceException: ### Error querying da ...
- Mysql忘记密码找回步骤
Mysql密码忘记找回步骤: 1.首先停止数据库 [root@localhost ~]# /etc/init.d/mysqld stop 2.使用--skip-grant-tables启动mysql, ...
- JavaScript事件对象与事件的委托
事件对象 包含事件相关的信息,如鼠标.时间.触发的DOM对象等 js默认将事件对象封装好,并自动的以参数的形式,传递给事件处理函数的第1个参数,如下: document.getElementsByTa ...
- kubectl alias auto complete
平时kubectl命令管理kubernetes,敲久了就觉得比较麻烦,想着使用alias k来代替kubectl,可是当输入k时没有了自动补全的功能 这里在 ~/.bashrc 添加如下配置后,可以自 ...