Codeforces Round#767(Div.2) F1. Game on Sum (Easy Version)
題目
Alice 和 Bob 被賦予數字 n、m 和 k,并進行如下游戲:
游戲有一個分數,愛麗絲試圖最大化,而鮑勃試圖最小化。分數最初為 0。游戲由 n 輪組成。每一輪,Alice 都會從 0 到 k(含)中選擇一個實數,Bob 將其加上到游戲得分中或從游戲得分中減去。但在整個游戲過程中,Bob 必須選擇在 n 輪中至少加上 m 個。
Bob 在決定是否從分數中添加或減去數字之前知道 Alice 選擇了哪個數字,并且 Alice 在選擇當前回合的數字之前知道 Bob 是添加還是減去了前一回合的數字(除了第一個回合,因為之前沒有回合)。
如果 Alice 和 Bob 都采取最優方案,那么游戲的最終得分是多少?
輸入
輸入的第一行包含一個整數 t (1≤t≤1000) — 測試用例的數量。測試用例的描述如下。
每個測試用例由一行包含三個整數 n、m 和 k (1≤m≤n≤2000,0≤k<109+7) — 圈數,Bob 必須經過多少圈add 和 Alice 可以選擇的最大數。
保證所有測試用例的 n 總和不超過 2000。
輸出
對于每個測試用例,輸出一個整數——最優游戲的分數以 109+7 為模。
形式上,令 M=109+7。可以證明,答案可以表示為不可約分數 pq,其中 p 和 q 是整數,q?0(modM)。輸出等于 p?q?1modM 的整數。換句話說,輸出這樣一個整數 x,即 0≤x<M 和 x?q≡p(modM)。
題解
當n=2, m=1 的答案是什么?
讓我們稱愛麗絲在第一回合選擇的號碼為 x。
如果 x 很小,Bob 可以添加它,然后 Alice 將不得不在最后一回合選擇 0,因為如果它不是 0,Bob 肯定會從分數中減去它,這意味著分數最終是 x。
如果 Alice 選擇了一個大數,Bob 可以減去它。然后 Alice 將在最后一回合中選擇她能選擇的最大數字k,最終得到 k-x 的分數。
由于 Bob 試圖最小化游戲的分數,Alice 應該選擇一個 x 使得它最大化 min(x,k?x) 的值。 x 和 k?x 都是 x 上的線性(直線)函數。使兩條線的最小值最大化的 x 值是它們的交點。線 x 和 k-x 的交點在 x=k/2。所以 Alice 應該在 n=2, m=1 的最優游戲中選擇 x=k/2。
為了將解推廣到任意 n 和 m,我們可以使用 DP。讓 DP[i][j] 其中n=i, m=j 得分是多少。
我們的初始邊界情況將是
DP[i][0]=0 因為如果 Bob 不能添加任何東西,Alice 必須總是選擇 0。
DP[i][i]=i?k 因為如果 Bob 總是要加,Alice 每次都可以選擇 k。
當 Bob 添加到分數時,游戲的其余部分將與減少 1 個回合和減少 1 個添加的游戲相同,除了游戲分數被 Alice 的數字抵消。當 Bob 從分數中減去時,剩下的游戲將與少 1 回合的游戲相同,只是游戲分數被負 Alice 的數字抵消。
Bob 將取其中的最小值,因此 DP 轉換將是
DP[i][j]=min(DP[i-1][j-1]+x,DP[i-1][j]-x) 對于 x 最大化這個值。
這與導致線之間相交的 n=2 情況相同。這個交叉點的分數很好地簡化為 DP[i][j]=(DP[i?1][j?1]+DP[i?1][j])/2
這個 O(n?m) 解決方案足夠快,可以通過這個問題的簡單版本。
總結
以上是生活随笔為你收集整理的Codeforces Round#767(Div.2) F1. Game on Sum (Easy Version)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 开发工具:IDEA EasyCode插
- 下一篇: 模仿360加速球制作一个动态Progre