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;
}
0 条评论