CF1458B Glass Half Spilled

题目描述

桌上有 $n$ 个玻璃杯,编号为 $1, \ldots, n$。第 $i$ 个玻璃杯最多可以容纳 $a_i$ 单位的水,目前其中有 $b_i$ 单位的水。 你希望选择 $k$ 个玻璃杯,并在它们中收集尽可能多的水。为此,你可以任意多次地将水从一个杯子倒到另一个杯子中。然而,由于杯子的奇怪形状(绝对不是因为你的笨拙),每次你尝试转移任意数量的水时,一半的水都会洒到地上。 具体来说,假设某个玻璃杯 $i$ 目前有 $c_i$ 单位的水,玻璃杯 $j$ 有 $c_j$ 单位的水。你尝试从玻璃杯 $i$ 向玻璃杯 $j$ 倒 $x$ 单位的水(显然 $x$ 不能超过 $c_i$)。那么,会有 $x/2$ 单位的水洒到地上。倒水后,玻璃杯 $i$ 剩下 $c_i - x$ 单位的水,玻璃杯 $j$ 变为 $\min(a_j, c_j + x/2)$ 单位的水(多余的水同样会洒出)。 每次倒水时,你可以任意选择从哪个玻璃杯 $i$ 向哪个玻璃杯 $j$ 倒水,倒水的量 $x$ 也可以是任意正实数。 对于每个 $k = 1, \ldots, n$,请你求出经过若干次倒水操作后,任意选择 $k$ 个玻璃杯,能够收集到的最大水量。

输入格式

第一行包含一个整数 $n$($1 \leq n \leq 100$),表示玻璃杯的数量。 接下来的 $n$ 行,每行包含两个整数 $a_i$ 和 $b_i$($0 \leq b_i \leq a_i \leq 100$,$a_i > 0$),分别表示第 $i$ 个玻璃杯的容量和当前水量。

输出格式

输出 $n$ 个实数,分别表示在 $1, \ldots, n$ 个玻璃杯中能够收集到的最大水量。你的答案只要每个数与精确答案的绝对误差或相对误差不超过 $10^{-9}$ 即可被接受。

说明/提示

在样例中,你可以这样操作: 2. 对于 $k = 1$,将前两个玻璃杯的水全部倒入第三个杯子,会洒掉 $(5 + 5) / 2 = 5$ 单位的水,最终第三个杯子中有 $2 + (5 + 5) / 2 = 7$ 单位的水; 3. 对于 $k = 2$,将第三个杯子的水倒回前两个中的任意一个,会洒掉 $2 / 2 = 1$ 单位的水,最终可以收集到 $5 + 5 + 2 / 2 = 11$ 单位的水; 4. 对于 $k = 3$,无需操作,所有 $5 + 5 + 2 = 12$ 单位的水都可以收集到。 由 ChatGPT 4.1 翻译