Codeforces 540D Bad Luck Island
http://codeforces.com/problemset/problem/540/D
题目大意:
会出石头、剪刀、布的人分别有r,s,p个,他们相互碰到的概率相同,输的人死掉,问最终活下去的人是三种类型的概率。
思路:
f[i][j][k]代表i个石头,j个剪刀,k个布状态的概率,初始f[n][m][K]=1
1 #include<cstdio> 2 #include<cmath> 3 #include<algorithm> 4 #include<cstring> 5 #include<iostream> 6 #define dou long double 7 dou jc[20005]; 8 dou f[105][105][105]; 9 int n,m,K; 10 int read(){ 11 int t=0,f=1;char ch=getchar(); 12 while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} 13 while ('0'<=ch&&ch<='9'){t=t*10+ch-'0';ch=getchar();} 14 return t*f; 15 } 16 int main(){ 17 n=read();m=read();K=read(); 18 f[n][m][K]=1.0; 19 for (int i=n;i>=0;i--) 20 for (int j=m;j>=0;j--) 21 for (int k=K;k>=0;k--) 22 if (f[i][j][k]>0) 23 { 24 int cnt=((int)(i==0))+((int)(j==0))+((int)(k==0)); 25 if (cnt>=2) continue; 26 double tot=i*j+j*k+k*i; 27 if (i>0) 28 f[i-1][j][k]+=f[i][j][k]*(i*k)/tot; 29 if (j>0) 30 f[i][j-1][k]+=f[i][j][k]*(i*j)/tot; 31 if (k>0) 32 f[i][j][k-1]+=f[i][j][k]*(k*j)/tot; 33 } 34 double ans1=0,ans2=0,ans3=0; 35 for (int i=1;i<=n;i++) 36 ans1+=(double)f[i][0][0]; 37 for (int i=1;i<=m;i++) 38 ans2+=(double)f[0][i][0]; 39 for (int i=1;i<=K;i++) 40 ans3+=(double)f[0][0][i]; 41 printf("%.9f %.9f %.9f\n",ans1,ans2,ans3); 42 return 0; 43 }