日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Codeforces Round#767(Div.2) F1. Game on Sum (Easy Version)

發布時間:2023/12/10 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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) 解決方案足夠快,可以通過這個問題的簡單版本。

#include<bits/stdc++.h> #define mod (int)(1e9+7) using namespace std; int f[2010][2010]; int main() {for(int i=1;i<=2000;i++){f[i][i]=i;for(int j=1;j<i;j++) f[i][j]=1ll*(mod+1)/2*(f[i-1][j-1]+f[i-1][j])%mod;}int t;cin>>t;while(t--){int n,m,k;cin>>n>>m>>k;cout<<1ll*f[n][m]*k%mod<<endl;}return 0; }

總結

以上是生活随笔為你收集整理的Codeforces Round#767(Div.2) F1. Game on Sum (Easy Version)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。