Codeforces 540D Bad Luck Island
2016-06-29 20:58
309 查看
http://codeforces.com/problemset/problem/540/D
思路:
f[i][j][k]代表i个石头,j个剪刀,k个布状态的概率,初始f
[m][K]=1
题目大意:
会出石头、剪刀、布的人分别有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; }
相关文章推荐
- SQL入门经典(一)之简介
- 第三方登录QQ
- JAVA并发集合学习总结
- 属性动画实现平移效果
- 简单三层加存储过程实现新闻列表分页
- 重构系列:减少成员变量个数,降低变量的作用范围
- 国际化:Java平台下的Locale类
- 如何通过使用 SQL Server 中的 Detach 和 Attach 函数将 SQL Server 数据库移到新位置
- Linux下which、whereis、locate、find命令的区别
- 加速android studio速度
- Centos配置yum源
- Android NDK编译环境配置
- linux内核栈与用户栈及调用栈观察方法
- Jsvc安装,配置 常规用户使用tomcat的80端口
- 图的遍历
- poj2240
- 重构系列:概论
- Jsvc安装,配置 常规用户使用tomcat的80端口
- C语言之位运算
- 一步一步造个IoC轮子(二),详解泛型工厂