NODSX2304B. 抽卡

NODSX2304B. 抽卡

题意

改个名字,Alice 和 Bob 在玩游戏……

\(n \le 15\) 个数字,每次玩家随机选择至多 \(m\) 个数,然后扔掉个数字。Alice 先手。Alice 会尽量使扔掉的权值和最大,Bob 希望尽量小。问最终权值是什么。

首先如果存在 \(m\) 张一定选 \(m\) 张,否则全选。然后想不到贪心解法。

注意到 \(n\) 很小,于是我们枚举子集,考虑 DP 转移。

\(f_{A/B,S}\) 表示这轮到谁,子集为 \(S\),的权值。转移比较显然。

\[f_{A,S}= \frac{1}{\binom {|S|}{\min (|S|,m)}} \sum \max(f_{B,S/mx}+a_{mx},f_{B,S})\\ f_{B,S}= \frac{1}{\binom {|S|}{\min (|S|,m)}} \sum \min(f_{A,S/mn}+a_{mn},f_{A,S})\]

其中 \(mx\) 表示目前枚举的随机选择的情况,选中的最大数字的下标。\(mn\) 就是最小。

然后你发现这玩意有个 \(\max , \min\) 十分地恶心。考虑枚举 \(mx,mn\),计算满足 \(mx,mn\) 合法的方案数,来讨论。

\(a_i\) 排序,以 \(f_A\) 的转移为例。

\(mx=i\),则我们钦定选定 \(i\),然后在 \(1\sim i-1\) 里面随机选择 \(m\) 个或者不够就 \(i-1\) 个数字的方案数,设为 \(k_i\)。然后加上 \(k_i \max(f_{B,S/mx}+a_{mx},f_{B,S})\)

我们把 \(f_{B,S/mx}\) 看做已知。相当于解方程:

\(A=f_{A,S},B=f_{B,S}\)

\[A=(一坨binom) \sum_i k1_i \max(B'+a_i,B)\\ B=(一坨binom) \sum_i k2_i \min (A'+a_i,A)\]

这玩意还是有 \(\max,\min\)

注意到题目只要我们输出浮点数,不用取模,所以一个部分分是直接枚举所有可能的 \(B\),然后代入方程判是否合法。

如果我们知道 \(A\)\(A'+a_i\)\(B\)\(B'+a_i\) 的大小关系,这个方程就是 \(i\) 的一堆前缀取常量,剩下取 \(A,B\)

枚举这个大小关系,只有 \(O(n^2)\),完全可以啊。

然后枚举,每次 \(O(1)\) 解方程即可。

题解有一种方法是,部分分是枚举 \(B\),代入式 \(1\) 可以求出 \(A\),然后代入式 \(2\) 可以求出 \(B''\),如果 \(B''=B\) 这个 \(A,B\) 就是答案。观察到 \(B''-B\) 的值随着 \(B\) 的增大是单调的,因此二分 \(B\) 找到 \(B''-B=0\) 的位置。注意掉精度问题,因此判相等就是相差小于 \(1e-7\) 左右。

posted @ 2024-09-29 21:37  wing_heart  阅读(14)  评论(0)    收藏  举报