UVA11021 Tribles 概率+期望
题目传送门
题意
现有\(k\)只麻球,每只麻球只能存活一天,在每只麻球死前有\(P_i\)的概率生出额外的\(i\)只麻球,求出\(m\)天内所有麻球都死亡的概率。(注意\(i\)的范围\(\left\{0,n-1\right\}\))
思路
由于每只麻球繁衍是独立进行的,因此我们可以将\(k\)只麻球看作是\(k\)个独立的族群,于是求出\(m\)天内所有麻球都死亡的概率就可以认为是\(m\)天内\(k\)个族群全部灭绝的概率。由于麻球都只能存活一天,并且独立存活,因此我们只需要思考一只麻球的情况,然后推广到所有即可。
对于一只麻球来说,假设其第\(i\)天所有后代都死亡的概率为\(f[i]\)。由于独立性,所有后代都可以看成是第一天的麻球,因此对于第\(i\)天,根据全概率公式,该麻球灭绝的概率为\(f_i=\sum_{j=0}^{n-1}P_{j}(f_{i-1})^j\)。
\(P_{j}(f_{i-1})^j\)表示该麻球生了\(j\)个后代,并且全部都在\(i-1\)天内死亡,每个后代死亡的概率均为\(f_{i-1}\),因此根据乘法公式,\(j\)只后代在\(i-1\)天内全部死亡的概率为\((f_{i-1})^j\)。
如此求出\(f[m]\)后,\(k\)只麻球在\(m\)天内灭绝的概率即\(f[m]^k\)。
参考代码
点此展开
//Author:Daneii
#include <bits/stdc++.h>
using namespace std;
#define in(x) scanf("%d",&x)
#define lin(x) scanf("%lld",&x)
#define din(x) scanf("%lf",&x)
typedef long long ll;
typedef long double ld;
typedef pair<int,int> PII;
const int N=1010;
double p[N];
double f[N];
int main()
{
int T;
in(T);
int kase=0;
while(T--)
{
int n,k,m;
in(n);in(k);in(m);
for(int i=0;i<n;i++) din(p[i]);
f[0]=0,f[1]=p[0];//注意初始化
for(int i=2;i<=m;i++)
{
f[i]=0;//有多组数据,需要清空
for(int j=0;j<n;j++)
{
f[i]+=p[j]*pow(f[i-1],j);
}
}
printf("Case #%d: %.7lf\n",++kase,pow(f[m],k));
}
return 0;
}

浙公网安备 33010602011771号