洛谷P2059 卡牌遊戲

2022-06-13 15:18:11 字數 1018 閱讀 7375

n個人坐成一圈玩遊戲。一開始我們把所有玩家按順時針從1到n編號。首先第一回合是玩家1作為莊家。每個回合莊家都會隨機(即按相等的概率)從卡牌堆裡選擇一張卡片,假設卡片上的數字為x,則莊家首先把卡片上的數字向所有玩家展示,然後按順時針從莊家位置數第x個人將被處決即退出遊戲。然後卡片將會被放回卡牌堆裡並重新洗牌。被處決的人按順時針的下乙個人將會作為下一輪的莊家。那麼經過n-1輪後最後只會剩下乙個人,即為本次遊戲的勝者。現在你預先知道了總共有m張卡片,也知道每張卡片上的數字。現在你需要確定每個玩家勝出的概率。

這裡有乙個簡單的例子:

例如一共有4個玩家,有四張卡片分別寫著3,4,5,6.

第一回合,莊家是玩家1,假設他選擇了一張寫著數字5的卡片。那麼按順時針數1,2,3,4,1,最後玩家1被踢出遊戲。

第二回合,莊家就是玩家1的下乙個人,即玩家2.假設玩家2這次選擇了一張數字6,那麼2,3,4,2,3,4,玩家4被踢出遊戲。

第三回合,玩家2再一次成為莊家。如果這一次玩家2再次選了6,則玩家3被踢出遊戲,最後的勝者就是玩家2.

先求出 \(g[i][j]\) 表示在有 \(i\) 個人且 \(1\) 號是莊家的時候,下乙個處決的是 \(j\) 號的方案數。顯然 \(\frac\) 就是下乙個處決 \(j\) 的期望。

然後設 \(f[i][j]\) 表示在剩餘 \(i\) 個人且 \(1\) 號是莊家,最後第 \(j\) 個人獲勝的期望。那麼

\[f[i][j]=\sum^_([k\neq j]\times f[i-1][(j-k+n)\bmod n]\times\frac)

\]記憶化搜尋即可。時間複雜度 \(o(n^3)\)。

#include using namespace std;

const int n=310;

const double eps=1e-12;

int n,m,a[n],g[n][n];

double f[n][n];

double dfs(int n,int x)

int main()

洛谷P2059 JLOI2013 卡牌遊戲

題目描述 n個人坐成一圈玩遊戲。一開始我們把所有玩家按順時針從1到n編號。首先第一回合是玩家1作為莊家。每個回合莊家都會隨機 即按相等的概率 從卡牌堆裡選擇一張卡片,假設卡片上的數字為x,則莊家首先把卡片上的數字向所有玩家展示,然後按順時針從莊家位置數第x個人將被處決即退出遊戲。然後卡片將會被放回卡...

P2059 JLOI2013 卡牌遊戲

傳送門 期望dp 剛開始想的就是dp 設 f i j 表示已經進行了 i 輪,莊家為 j 但是發現好像轉不了.不知道哪些人被踢出去了.看一下資料,好像搞不了狀壓 那麼換種思路 從 結束狀態 往 開始狀態 推 不需要知道具體哪個人是莊家,只要知道與莊家相對位置為 x 時的獲勝概率 好像可以.設 f i...

概率DP P2059 卡牌遊戲

鏈結 題目描述 n個人坐成一圈玩遊戲。一開始我們把所有玩家按順時針從1到n編號。首先第一回合是玩家1作為莊家。每個回合莊家都會隨機 即按相等的概率 從卡牌堆裡選擇一張卡片,假設卡片上的數字為x,則莊家首先把卡片上的數字向所有玩家展示,然後按順時針從莊家位置數第x個人將被處決即退出遊戲。然後卡片將會被...