NODSX2304B. 抽卡
題意
改個名字,Alice 和 Bob 在玩遊戲……
有 \(n \le 15\) 個數字,每次玩家隨機選擇至多 \(m\) 個數,然後扔掉個數字。Alice 先手。Alice 會盡量使扔掉的權值和最大,Bob 希望儘量小。問最終權值是什麼。
首先如果存在 \(m\) 張一定選 \(m\) 張,否則全選。然後想不到貪心解法。
注意到 \(n\) 很小,於是我們列舉子集,考慮 DP 轉移。
設 \(f_{A/B,S}\) 表示這輪到誰,子集為 \(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}\)。
這玩意還是有 \(\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\) 左右。