您的位置:首页 > 其它

Codeforces 540D Bad Luck Island

2016-06-29 20:58 309 查看
http://codeforces.com/problemset/problem/540/D

题目大意:

会出石头、剪刀、布的人分别有r,s,p个,他们相互碰到的概率相同,输的人死掉,问最终活下去的人是三种类型的概率。

思路:

f[i][j][k]代表i个石头,j个剪刀,k个布状态的概率,初始f
[m][K]=1

#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<iostream>
#define dou long double
dou jc[20005];
dou f[105][105][105];
int n,m,K;
int read(){
int t=0,f=1;char ch=getchar();
while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
while ('0'<=ch&&ch<='9'){t=t*10+ch-'0';ch=getchar();}
return t*f;
}
int main(){
n=read();m=read();K=read();
f
[m][K]=1.0;
for (int i=n;i>=0;i--)
for (int j=m;j>=0;j--)
for (int k=K;k>=0;k--)
if (f[i][j][k]>0)
{
int cnt=((int)(i==0))+((int)(j==0))+((int)(k==0));
if (cnt>=2) continue;
double tot=i*j+j*k+k*i;
if (i>0)
f[i-1][j][k]+=f[i][j][k]*(i*k)/tot;
if (j>0)
f[i][j-1][k]+=f[i][j][k]*(i*j)/tot;
if (k>0)
f[i][j][k-1]+=f[i][j][k]*(k*j)/tot;
}
double ans1=0,ans2=0,ans3=0;
for (int i=1;i<=n;i++)
ans1+=(double)f[i][0][0];
for (int i=1;i<=m;i++)
ans2+=(double)f[0][i][0];
for (int i=1;i<=K;i++)
ans3+=(double)f[0][0][i];
printf("%.9f %.9f %.9f\n",ans1,ans2,ans3);
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: