1. 程式人生 > >牛客國慶集訓 紙牌遊戲 概率

牛客國慶集訓 紙牌遊戲 概率

i++ 紙牌遊戲 ron 遊戲 希望 font size 其中 代碼

一、題意

某個遊戲體系中共有N種卡牌,其中M種是稀有的。小貝每次和電腦對決獲勝之後都會有一個抽卡機會,這時系統會隨機從N種卡中選擇一張給小貝。普通卡可能多次出現,而稀有卡牌不會被重復抽到。小貝希望收集到K種稀有卡牌,她想知道期望需要多少次獲勝才能實現這個目標。

二、分析

2.1前置知識

獨立重復試驗的數學期望一個例子:一次射箭射中的概率為p,連續射擊直到射中,射箭次數X的概率分布為\[P\left( {X = k} \right) = {\left( {1 - p} \right)^{k - 1}}p\]

可以求得其數學期望為\[E\left( X \right) = \sum\limits_{k = 1}^\infty {k{{\left( {1 - p} \right)}^{k - 1}}p = p\sum\limits_{k = 1}^\infty {k{{\left( {1 - p} \right)}^k} = \frac{1}{p}} } \]

2.2本題思路

原題意敘述的不清楚,應該是一共N張卡牌,其中M張為稀有卡;對卡牌做如下操作:不斷在牌堆中取牌,取到普通牌後放回,取到稀有牌後不放回,直到取到K張稀有牌為止,求完成這一目標的期望操作數。

由於取出普通牌會放回,所以取出普通牌後不會改變在剩余牌堆中取出稀有牌的概率;所以將事件"在牌堆中取出K張稀有牌"表示為事件X,事件${x_i}$表示"共N-i張牌,其中M-i張稀有牌的牌堆中取到一張稀有牌",根據前置知識的分析,一次事件${x_i}$就對應一次射箭的場景;

那麽事件X可以表示為$X = \sum\limits_{i = 0}^{k - 1} {{x_i}}$,根據期望的可加性有$ans = \sum\limits_{i = 0}^{k - 1} {\frac{{N - i}}{{M - i}}}$

三、代碼

 1 # include <iostream>
 2 # include <cstdio>
 3 using namespace std;
 4 int T,N,M,K;
 5 void Init()
 6 {
 7     scanf("%d%d%d",&N,&M,&K);
 8 }
 9 double Solve()
10 {
11     double res = 0;
12     for(int i=0;i<K;i++)
13         res+=((double)(N-i))/((double
)(M-i)); 14 return res; 15 } 16 int main() 17 { 18 scanf("%d",&T); 19 for(int i=1;i<=T;i++) 20 { 21 Init(); 22 double ans = Solve(); 23 printf("Case #%d: %f\n",i,ans); 24 } 25 return 0; 26 }

牛客國慶集訓 紙牌遊戲 概率