CF1458B.Glass Half Spilled

传统题 时间 2000 ms 内存 256 MiB 10 尝试 3 已通过 2 标签

Glass Half Spilled

题目描述

桌上有 nn 个玻璃杯,编号为 1,,n1, \ldots, n。第 ii 个玻璃杯最多可以容纳 aia_i 单位的水,目前其中有 bib_i 单位的水。

你希望选择 kk 个玻璃杯,并在它们中收集尽可能多的水。为此,你可以任意多次地将水从一个杯子倒到另一个杯子中。然而,由于杯子的奇怪形状(绝对不是因为你的笨拙),每次你尝试转移任意数量的水时,一半的水都会洒到地上。

具体来说,假设某个玻璃杯 ii 目前有 cic_i 单位的水,玻璃杯 jjcjc_j 单位的水。你尝试从玻璃杯 ii 向玻璃杯 jjxx 单位的水(显然 xx 不能超过 cic_i)。那么,会有 x/2x/2 单位的水洒到地上。倒水后,玻璃杯 ii 剩下 cixc_i - x 单位的水,玻璃杯 jj 变为 min(aj,cj+x/2)\min(a_j, c_j + x/2) 单位的水(多余的水同样会洒出)。

每次倒水时,你可以任意选择从哪个玻璃杯 ii 向哪个玻璃杯 jj 倒水,倒水的量 xx 也可以是任意正实数。

对于每个 k=1,,nk = 1, \ldots, n,请你求出经过若干次倒水操作后,任意选择 kk 个玻璃杯,能够收集到的最大水量。

输入格式

第一行包含一个整数 nn1n1001 \leq n \leq 100),表示玻璃杯的数量。

接下来的 nn 行,每行包含两个整数 aia_ibib_i0biai1000 \leq b_i \leq a_i \leq 100ai>0a_i > 0),分别表示第 ii 个玻璃杯的容量和当前水量。

输出格式

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

说明/提示

在样例中,你可以这样操作:

  1. 对于 k=1k = 1,将前两个玻璃杯的水全部倒入第三个杯子,会洒掉 (5+5)/2=5(5 + 5) / 2 = 5 单位的水,最终第三个杯子中有 2+(5+5)/2=72 + (5 + 5) / 2 = 7 单位的水;
  2. 对于 k=2k = 2,将第三个杯子的水倒回前两个中的任意一个,会洒掉 2/2=12 / 2 = 1 单位的水,最终可以收集到 5+5+2/2=115 + 5 + 2 / 2 = 11 单位的水;
  3. 对于 k=3k = 3,无需操作,所有 5+5+2=125 + 5 + 2 = 12 单位的水都可以收集到。

由 ChatGPT 4.1 翻译

样例

3
6 5
6 5
10 2
7.0000000000 11.0000000000 12.0000000000

在线编程 IDE

建议全屏模式获得最佳体验