有 A,B 两个人分别有 n,m 的血量,每轮都扔筛子,点数小的扣一滴血。某人的血量扣到 0 就输了。已知两个人扔出每个点的概率。求最后 A 赢的概率。
很显然我们计算出两个人点数小的概率为 x,y,然后递推就行。初始化 f[i][0]=1.0
全 wa
#include<bits/stdc++.h>
using namespace std;
typedef double db;
const int N=1e3+10;
int n,m;
db x,y,ans,a[N],b[N],suma[N],sumb[N],f[N][N],e=1.0;
int read(){
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+(ch^48);
ch=getchar();
}
return x*f;
}
int main(){
int i,j;
n=read();m=read();
for(i=1;i<=6;i++) cin>>a[i];
for(i=1;i<=6;i++) cin>>b[i];
for(i=1;i<=6;i++) suma[i]=suma[i-1]+a[i];
for(i=1;i<=6;i++) sumb[i]=sumb[i-1]+b[i];
for(i=1;i<=6;i++) y+=(a[i]*sumb[i-1]);
for(i=1;i<=6;i++) x+=(b[i]*suma[i-1]);
for(i=1;i<=n;i++) f[i][0]=1.0;
for(i=1;i<=n;i++){
for(j=1;j<=m;j++){
f[i][j]+=f[i-1][j]*x;
f[i][j]+=f[i][j-1]*y;
}
}
ans=f[n][m];
printf("%.6f\n",ans);
return 0;
}