Codeforces 540D Bad Luck Island

Posted GFY

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 }

 

 

 

 

以上是关于Codeforces 540D Bad Luck Island的主要内容,如果未能解决你的问题,请参考以下文章

CF 540D Bad Luck Island

「日常训练」Bad Luck Island(Codeforces Round 301 Div.2 D)

CF540D Bad Luck Island(期望dp)

CF540D Bad Luck Island

Codeforces 540 D Bad Luck Island

[Codeforces Round #301 (Div. 2) D]Bad Luck Island(概率Dp)