LightOJ 1408 Batting Practice 概率/期望

Batting Practice LightOJ - 1408

连续击球,击不中的概率是 pp,连续击中 k1k_1 次时或连续 k2k_2 次都没有击中时停止击球,问停止击球时的期望击球数。

f(x)f(x) 为已经连续击中 xx 次后停止击球的期望击球数。

g(x)g(x) 为已经连续失击 xx 次后停止击球的期望击球数。

f(k1)=g(k2)=0f(k_1)=g(k_2)=0 ,对于 xk1x\le k_1

f(x)=(1p)f(x+1)+pg(1)+1f(x)+b=(1p)(f(x+1)+b)f(x)=(1p)f(x+1)pbb=g(1)1pf(x)+b=(1p)k1x(f(k1)+b)=b(1p)k1xf(1)=b(1p)k11bf(1)=(g(1)+1p)(1(1p)k11) \begin{aligned} f(x)&=(1-p)f(x+1)+pg(1)+1\\ f(x)+b&=(1-p)(f(x+1)+b)\\ f(x)&=(1-p)f(x+1)-pb\\ b&=-g(1)-\frac{1}{p}\\ f(x)+b&=(1-p)^{k_1-x}(f(k_1)+b)\\ &=b(1-p)^{k_1-x}\\ f(1)&=b(1-p)^{k_1-1}-b\\ f(1)&=(g(1)+\frac{1}{p})(1-(1-p)^{k_1-1}) \end{aligned}

对于 xk2x\le k_2

g(x)=pg(x+1)+(1p)f(1)+1g(x)+a=p(g(x+1)+a)g(x)=pg(x+1)+a(p1)a=f(1)11pg(x)+a=pk2x(g(k2)+a)=apk2xg(1)=apk21ag(1)=(f(1)+11p)(1pk21) \begin{aligned} g(x)&=pg(x+1)+(1-p)f(1)+1\\ g(x)+a&=p(g(x+1)+a)\\ g(x)&=pg(x+1)+a(p-1)\\ a&=-f(1)-\frac{1}{1-p}\\ g(x)+a&=p^{k_2-x}(g(k_2)+a)\\ &=ap^{k_2-x}\\ g(1)&=ap^{k_2-1}-a\\ g(1)&=(f(1)+\frac{1}{1-p})(1-p^{k_2-1}) \end{aligned}

然后解出来 f(1),g(1)f(1),g(1),如下:

f(1)=((f(1)+11p)(1pk21)+1p)(1(1p)k11)f(1)=((f(1)+1q)(1pk21)+1p)(1qk11)(1(1pk21)(1qk11))f(1)=1q(1pk21)(1qk11)+1p(1qk11)f(1)=pkqkp+qqkpq(1pkqk)=pkqk/q+qk/p1pkqkg(1)=(f(1)+1q)pk=pkqkq+ppkpq(1pkqk)=pkqk/p+pk/q1pkqk \begin{aligned} f(1)&=((f(1)+\frac{1}{1-p})(1-p^{k_2-1})+\frac{1}{p})(1-(1-p)^{k_1-1})\\ f(1)&=((f(1)+\frac{1}{q})(1-p^{k_2-1})+\frac{1}{p})(1-q^{k_1-1})\\ (1-(1-p^{k_2-1})(1-q^{k_1-1}))f(1)&=\frac{1}{q}(1-p^{k_2-1})(1-q^{k_1-1})+\frac{1}{p}(1-q^{k_1-1})\\ f(1)&=\frac{p_kq_kp+qq_k}{pq(1-p_kq_k)}=\frac{p_kq_k/q+q_k/p}{1-p_kq_k}\\ g(1)&=(f(1)+\frac{1}{q})p_k\\ &=\frac{p_kq_kq+pp_k}{pq(1-p_kq_k)}=\frac{p_kq_k/p+p_k/q}{1-p_kq_k}\\ \end{aligned}

然后结果为 res=(1p)f(1)+pg(1)+1res=(1-p)f(1)+pg(1)+1

代码如下:

#include<iostream>
#include<cstdio>
#include<cmath>
//#define WINE
#define eps 1e-6
using namespace std;
int T,iCase,k1,k2;
double p,q,pk,qk,f1,g1;
int main(){
#ifdef WINE
    freopen("data.in","r",stdin);
#endif
    scanf("%d",&T);
    while(T--){
        scanf("%lf%d%d",&p,&k1,&k2);
        q=1-p;
        if(p<eps){
            printf("Case %d: %d\n",++iCase,k1);
            continue;
        }
        if(q<eps){
            printf("Case %d: %d\n",++iCase,k2);
            continue;
        }
        pk=1-pow(p,k2-1);qk=1-pow(q,k1-1);
        f1=(pk*qk/q+qk/p)/(1-pk*qk);
        g1=(pk*qk/p+pk/q)/(1-pk*qk);
        printf("Case %d: %.8lf\n",++iCase,q*f1+p*g1+1);
    }
    return 0;
}

在这里插入图片描述

posted @ 2020-03-27 08:41  winechord  阅读(65)  评论(0编辑  收藏  举报