NODSX2304B. 抽卡

liyixin發表於2024-09-29

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 \max (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\) 左右。

相關文章