H - 卡牌遊戲(簡單期望)
阿新 • • 發佈:2018-11-08
Description
小貝喜歡玩卡牌遊戲。某個遊戲體系中共有N種卡牌,其中M種是稀有的。小貝每次和電腦對決獲勝之後都會有一個抽卡機會,這時系統會隨機從N種卡中選擇一張給小貝。普通卡可能多次出現,而稀有卡牌不會被重複抽到。小貝希望收集到K種稀有卡牌,她想知道期望需要多少次獲勝才能實現這個目標。
輸入描述:
資料有多組,第一行一個整數T表示資料組數。
每組資料一行,三個整數N,M,K .
輸出描述:
對於每組資料,輸出形如"Case #x: y",其中 x 為這組資料的編號(從1開始),y 為這組資料的答案。答案的絕對誤差或相對誤差在以內都認為是正確的。
備註
1 ≤ T ≤ 100
1 ≤ N ≤ 105
1 ≤ M ≤ N
1 ≤ K ≤ M
Sample Input
2
5 2 1
40 9 5
Sample Ouput
Case #1: 2.5
Case #2: 28.1146825397
Source::傳送門
題解
題意:N種牌,M種稀有,每抽一次,會隨機從N種牌中抽取一張,但M種稀有牌不會重複抽到。現在想得到K種稀有卡牌,問抽牌的次數期望是多少。
第一次做期望題目,有點迷。關鍵解題就是得推公式了!
推導過程:
1.當k = 1 時:第一次抽到概率
第二次抽到概率為
....
第n次的抽到的概率為*
期望 E= 1* + 2 * * * * = - n * (錯位相減求和)
當
2.當k = 2時,因為M種稀有牌不會重複得到,所以可以分解為兩個子問題,即可理解為先從N種牌,M種稀有種得到一個,再從N-1種牌,M-1種稀有種得到1種。所以E = + .
3.依次類推 E = 。
AC Code
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int MAXN = (int)1e5+10;
const int INF = 0x3f3f3f3f;
int main()
{
int T, n, m ,k, id = 0;
cin>> T;
while(T--)
{
id++;
cin>> n >> m >> k;
double ans = 0;
for(int i=1; i<=k; i++)
{
ans += 1.0 * n / m;
n--; m--;
}
printf("Case #%d: %lf\n",id,ans);
}
return 0;
}