有 n 個紅球和 m 個藍球,a,b,c 三個人,輪流取球。若 a 取到紅球則 a 勝利,若 b 取到紅球則 b 勝利,c只負責取球搗亂,不參與勝負。若最後全部球取完後 a 沒有拿到紅球,則 b 勝利,求 a 勝利的概率。就是 a、b誰拿了紅的就贏,結束,最後沒人拿到紅,算 b 贏,問 a 贏的概率。牛客網上看,bfs 結果好像對,但是超記憶體了,就想到應該 bottom-up 不應該 top-down 的。(輸入:m, n
輸出:a 勝利的概率,保留 5 位小數(補零)
樣例輸入: 3 4 (3 個紅球,4 個藍球)
樣例輸出 0.62857
printf
自動四捨五入)。
#include
#include
using
namespace std;
double
process
(int n,
int m)
}return dp[n]
[m];
}int
main()
dp[i][j]
表示 i 個紅球,j 個藍球的情況下 a 獲勝的概率。顯然 j == 0 時,a必贏;i == 0時,a必輸;乙個紅球,乙個藍球,a 獲勝概率 50%。
上邊的第一種情況(i + j < 3 || j <= 1),也就是最多三個人各摸乙個球肯定就結束了,這時dp[i][j]
就是 a 上來就摸到紅球的概率:ii+
j\frac
i+ji
上邊的第二種情況(j < 3),dp[i][j]
有兩個組成部分:
1、i i+
j\frac
i+ji
:a直接摸到紅球的概率
2、j i+
j⋅j−
1i+j
−1⋅i
i+j−
2⋅dp
[i−1
][j−
2]
\frac \cdot \frac \cdot \frac \cdot dp[i - 1][j - 2]
i+jj⋅
i+j−
1j−1
⋅i+
j−2i
⋅dp
[i−1
][j−
2]:a藍、b藍、c紅,之後 a紅 的概率
上邊的第三種情況,也就是最通用的情況下,dp[i][j]
有三個組成部分:
1、i i+
j\frac
i+ji
:a直接摸到紅球的概率
2、j i+
j⋅j−
1i+j
−1⋅j
−2i+
j−2⋅
dp[i
][j−
3]
\frac \cdot \frac \cdot \frac \cdot dp[i][j - 3]
i+jj⋅
i+j−
1j−1
⋅i+
j−2j
−2⋅
dp[i
][j−
3]:a藍、b藍、c藍,之後 a紅 的概率
3、j i+
j⋅j−
1i+j
−1⋅i
i+j−
2⋅dp
[i−1
][j−
2]
\frac \cdot \frac \cdot \frac \cdot dp[i - 1][j - 2]
i+jj⋅
i+j−
1j−1
⋅i+
j−2i
⋅dp
[i−1
][j−
2]:a藍、b藍、c紅,之後 a紅 的概率
2019愛奇藝機試題 紅藍球
袋子中裝有n個紅球和m個藍球,a,b,c,三人依次抽取小球,若a抽到紅球則勝出,b抽到紅球則a失敗,c陪跑,純粹出來搗亂。但如果袋內紅球被抽完還未決斷勝負,則判定為b勝出。求a勝出概率。模擬抽球過程,採用遞迴的方式實現概率計算。n,m int x for x in input split defpr...
等概率放球
題目 有乙個機器按自然數序列的方式吐出球 1號球,2號球,3號球,你有乙個袋子,袋子最多只能裝下k個球,並且除袋子以外,你沒有更多的空間。設計一種選擇方式,使得當機器吐出第n號球的時候 n k 你袋子中的球數是k個,同時可以保證從1號球到n號球中的每乙個,被選進袋子的概率都是k n frac nk ...
模擬賽 紅藍牌
題目 明明有n張牌,正面按編號寫有數字1到n 每個數字只出現一次 每張牌的反面根據正面的數字塗上兩種顏色。如果正面的數字是質數,則為紅色,反之為藍色。明明的老師從這n張牌裡選出了一些,按數字從小到大排序後全部反面向上放成一行。他要明明判斷這些牌上的數字。輸入格式 第一行 乙個正整數n,1 n 100...