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;
}
posted @ 2021-08-04 14:17  Daneii  阅读(38)  评论(0)    收藏  举报