這題最開始是用 \(n^\)的演算法水過的,之後才想出的\(n^\)正解。首先,\(n^\) 應該是很容易想到的:設狀態 \(f[i][j][k]\) 為有 \(i\) 個人,莊家為 \(j\) 號人時,第 \(k\) 個人勝出的概率。這樣,只需要去掉本輪淘汰的人,加上 \(i - 1\) 個人時該人勝出的概率即可。
#include usingnamespace
std;
#define maxn 55
#define db double
intn, m, a[maxn];
db p, f[maxn][maxn][maxn];
intread()
while(c >= '
0' && c <= '
9') x = x * 10 + c - '
0', c =getchar();
return x *k;
}int
main()
}for(int i = 1; i <= n; i ++)
printf(
"%.2lf%%
", f[n][1][i] * 100
);
return0;
}
但是這題還有更優的做法。我們再看一看自己所設定的狀態,詳加思考就會發現:其實第二維是不必要的。誰做莊家實際上都是乙個相對的概念,我們可以強制讓\(1\) 號為莊家,這樣只需要在新的環上找出原來編號為 \(k\) 的人對應的新編號 \(k'\) 並加上其概率就好啦。
#include usingnamespace
std;
#define maxn 55
#define db double
intn, m, a[maxn];
db p, f[maxn][maxn];
intread()
while(c >= '
0' && c <= '
9') x = x * 10 + c - '
0', c =getchar();
return x *k;
}int
main()
for(int i = 1; i <= n; i ++)
printf(
"%.2lf%%
", f[n][i] * 100
);
return0;
}
題解 JLOI2013 卡牌遊戲
概率dp,應該做得還是比較少的 設 f i j 為該圈有 i 人時,第 j 個人最後勝利的概率 列舉選擇第幾張卡牌,設其值為 card k 那麼被淘汰的則是 card k i 分類討論 就是這樣,最後算百分數不要忘記乘一百 include include include include includ...
JLOI2013 卡牌遊戲
讀完題可以很容易的想到暴力模擬,列舉每一張卡片,然後看誰被淘汰,去掉被淘汰的人後從他的下乙個人開始重複上面的操作,直到剩下乙個人,那麼乙個人獲勝的概率就是他贏的狀態數除以總狀態數,複雜度為o n o n o n 直接t tt飛。考慮優化,我們發現複雜度主要是被人的編號所約束,因為我們在考慮乙個人獲勝...
JLOI2013 卡牌遊戲
jloi2013 卡牌遊戲 n個人坐成一圈玩遊戲。一開始我們把所有玩家按順時針從1到n編號。首先第一回合是玩家1作為莊家。每個回合莊家都會隨機 即按相等的概率 從卡牌堆裡選擇一張卡片,假設卡片上的數字為x,則莊家首先把卡片上的數字向所有玩家展示,然後按順時針從莊家位置數第x個人將被處決即退出遊戲。然...