#P52061. 「THUPC 2021 初赛」切切糕

「THUPC 2021 初赛」切切糕

题目描述

Kiana 喜欢吃甜点,某天她从商店中买回来 NN 块切糕与 Tinytree 共同分享,其中第 ii 块切糕的大小用一个数 AiA_i 来表示。

因为每块切糕的风味都不同,所以 Kiana 和 Tinytree 决定将每块切糕都切成两份,两人各选一份品尝。但切切糕是一个自古以来的大难题,经过商议,Kiana 打算执刀来切切糕,而 Tinytree 有 MM 次“优先选糕权”,可以获得一些切糕切开后的优先选择权,具体来说,两人按照如下流程进行操作:

步骤一:Kiana 从还没切的切糕中按自己的想法选一块出来,并将其切成两份,其中每份切糕的大小可以是任意正实数,也可以是 0\mathbf{0},且两份切糕的大小之和与切之前的大小相同

步骤二:Tinytree 观察完 Kiana 切出的两份切糕大小后,如果还有“优先选糕权”次数剩余,则可以决定是否消耗 11 次“优先选糕权”来进行优先选择。

步骤三:如果 Tinytree 选择使用“优先选糕权”,则她可以从两份切糕中任选一份,另一份则归 Kiana,如果 Tinytree 选择不使用或者已经用完了 MM 次“优先选糕权”,则 Kiana 从两份切糕中任选一份,另一份则归 Tinytree,然后两人回到步骤一,直到所有的切糕都切完。

假设 Kiana 和 Tinytree 都足够聪明,在自己可以操作时总是想办法让自己最终获得的切糕总大小尽可能大,且开始切第一块切糕之前 NN 块切糕的大小是两人都已知的,“优先选糕权”不要求全部用完。现在 Kiana 想知道,自己能获得的切糕总大小是多少,由于 Kiana 自己不会算,所以希望你能够帮助她。

输入格式

第一行包含两个正整数 NNMM1MN25001 \le M \le N \le 2500),分别表示切糕的总数和 Tinytree 初始时“优先选糕权”的次数。
第二行包含 NN 个正整数,其中第 ii 个数 AiA_i1Ai500001 \le A_i \le 50000)表示第 ii 块切糕的大小。

输出格式

输出共一行,包含一个实数,表示 Kiana 最终能获得的切糕总大小,所有输出精确到小数点后六位。

样例

4 3
4 3 2 1

5.250000

在这个样例中总共有 44 块切糕,大小分别为 4,3,2,14,3,2,1,Tinytree 的“优先选糕权”一共有三次,两人可以按照如下顺序和方式来分配切糕:

第一块:Kiana 选择大小为 33 的切糕,将其切成大小为 1.251.251.751.75 的两部分,Tinytree 使用一次“优先选糕权”选走 1.751.75 的部分,Kiana 目前总共获得大小 1.251.25 的切糕。

第二块:Kiana 选择大小为 11 的切糕,将其切成大小为 0011 的两部分,Tinytree 不使用“优先选糕权”,Kiana 独得此糕,目前总共获得大小 2.252.25 的切糕。

第三块:Kiana 选择大小为 22 的切糕,将其切成大小为 1111 的两部分,Tinytree 使用一次“优先选糕权”选走 11 的部分,Kiana 目前总共获得大小 3.253.25 的切糕。

第四块:Kiana 选择大小为 44 的切糕,将其切成大小为 2222 的两部分,Tinytree 使用一次“优先选糕权”选走 22 的部分,Kiana 目前总共获得大小 5.255.25 的切糕。

综上所述,该样例输出 5.2500005.250000,且可以证明在这个方案中如果任意一人改变自己的策略,其获得的切糕总大小不可能变得更大。

来源

来自 2021 清华大学学生程序设计竞赛暨高校邀请赛(THUPC2021)初赛。

题解等资源可在 https://github.com/THUSAAC/THUPC2021-pre 查看。