1. 题目

传送门= ̄ω ̄=

2. 题解

傻逼出题人毁我青春
你卡空间就算了,题目搞英文也很正常,但你把第一个人和第二个人的血量搞反是几个意思?

设 $f(i,j)$为第一个人有 $i$点 hp,第二个人有 $j$点 hp 的这个局面出现的几率。
设 $e1$为第一个人在一局内胜利的几率(在任意一局内,第一个人胜利和第二个人胜利的几率是不变的),$e2$为第二个人在一局内胜利的几率。

$f(i-1,j)+=f(i,j)\times e2,f(i,j-1)+=f(i,j)\times e1$
(懒得写真正的递推式了)
$f(hp1,hp2)=1$

最后答案为 $f(i,0)$的和。

注意 $e1+e2$可能不等于 0,需要 $e1=e1/(e1+e2),e2=e2/(e1+e2)$

代码:

#include <cstdio>
using namespace std;
int h1,h2;
double p1[6],p2[6],e1,e2,f[2001][2001],ans,esum;
int main()
{
    while(~scanf("%d%d",&h2,&h1))
    {
        for(int i=0;i<=h1;i++)for(int j=0;j<=h2;j++)f[i][j]=0;
        for(int i=0;i<6;i++)scanf("%lf",&p1[i]);
        for(int i=0;i<6;i++)scanf("%lf",&p2[i]);
        f[h1][h2]=1.0,ans=e1=e2=0.0;
        for(int i=0;i<6;i++)
            for(int j=0;j<6;j++)
                if(i>j)e1+=p1[i]*p2[j];
                else if(j>i)e2+=p1[i]*p2[j];
        esum=e1+e2,e1=e1/esum,e2=e2/esum;
        for(int i=h1;i>0;i--)
            for(int j=h2;j>0;j--)
                f[i-1][j]+=f[i][j]*e2,f[i][j-1]+=f[i][j]*e1;
        for(int i=1;i<=h1;i++)ans+=f[i][0];
        printf("%.6lf\n",ans);
    }
    return 0;
}
分类: 文章

XZYQvQ

炒鸡辣鸡的制杖蒟蒻一枚QvQ

0 条评论

发表回复

Avatar placeholder

您的电子邮箱地址不会被公开。 必填项已用*标注