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 ...
随机推荐
- python psutil 编译中断。 error: command 'gcc' failed with exit status 1
error info [root@chenbj psutil-2.0.0]# python setup.py install running install running bdist_egg run ...
- SecureCRT连接Linux
一.服务端 1.在linux上安装openssh-server服务,并确认打开了22监听端口 1)安装openssh-server:apt-get install openssh-server 2)查 ...
- 外网访问FTP服务,解决只能以POST模式访问Filezilla的问题
在内网可以正常使用PASV,但是在外网不行,导致数据传输慢或者根本连接不了,在FlashFXP中通过日志,找到了解决方法解决方法1.在Filezilla——Edit——Settings——Passiv ...
- 深入理解Java GC
一.概述 GC(Carbage Collection)垃圾收集器,由JVM自动回收已死亡的对象垃圾. 这也是Java与C++等语言的主要区别之一. 二.如何确认对象已死 1. 引用计数算法 引用计数法 ...
- 操作系统(1)_操作系统结构_李善平ppt
cpu和内存之间通过地址总线.数据总线.控制总线连接.外部总线连接外部设备.下图有问题,内存和外设没有直接连接.同一组总线,CPU和内存连接的时候硬盘就不能和内存连接,否则有冲突,core和core之 ...
- java基础面试题:写clone()方法时,通常都有一行代码,是什么?
clone()方法 与new constructor()构造器创建对象不同 是克隆一个新的对象 package com.swift; public class Clone_Test { public ...
- 1- vue django restful framework 打造生鲜超市
Vue+Django REST framework实战 使用Python3.6与Django2.0.2(Django-rest-framework)以及前端vue开发的前后端分离的商城网站 项目支持支 ...
- php短网址生成算法
<?php //短网址生成算法 class ShortUrl { //字符表 public static $charset = "0123456789ABCDEFGHIJKLMNOPQ ...
- 虚拟主机的搭建(ubuntu+apache2)
搭建环境:windows+VMware(Ubuntu)+apache2.(同一IP,不同域名) 1:在VMware的虚拟机Ubuntu下安装apache2(怎么安装百度一下就能找到): 2: apac ...
- Jane Austen【简·奥斯汀】
Jane Austen Jane Austen, a famous English writer, was born at Steventon, Hampshire, on December 16, ...