题目描述:

Bad Luck Island

time limit per test

2 seconds

memory limit per test

256 megabytes

input

standard input

output

standard output

The Bad Luck Island is inhabited by three kinds of species: r rocks, s scissors and p papers. At some moments of time two random individuals meet (all pairs of individuals can meet equiprobably), and if they belong to different species, then one individual kills the other one: a rock kills scissors, scissors kill paper, and paper kills a rock. Your task is to determine for each species what is the probability that this species will be the only one to inhabit this island after a long enough period of time.

Input

The single line contains three integers r, s and p (1 ≤ r, s, p ≤ 100) — the original number of individuals in the species of rock, scissors and paper, respectively.

Output

Print three space-separated real numbers: the probabilities, at which the rocks, the scissors and the paper will be the only surviving species, respectively. The answer will be considered correct if the relative or absolute error of each number doesn't exceed 10 - 9.

Examples

Input

Copy

2 2 2

Output

Copy

0.333333333333 0.333333333333 0.333333333333

Input

Copy

2 1 2

Output

Copy

0.150000000000 0.300000000000 0.550000000000

Input

Copy

1 1 3

Output

Copy

0.057142857143 0.657142857143 0.285714285714

思路:

这道题刚看的时候觉得好神奇啊,一定要用到好高大上的概率知识,但是我的数学已经丢完了,只能跳过了。知道了解法之后更觉得神奇,啊~神奇的概率dp。

定义dp[i][j][k]是物种石头剩下i个,剪刀剩下j个,布剩下k个的情形发生的概率。刚开始时dp[r][s][p]=1,现在考虑状态转移。

什么时候剪刀会少一个呢?它遇到了石头,这种情况发生的概率呢?\(\frac{C_s^1*C_r^1}{C_{r+s+p}^2}\),同理少一个布呢?它遇到了剪刀,概率呢?\(\frac{C_p^1*C_s^1}{C_{r+s+p}^2}\),石头少一个的概率是\(\frac{C_p^1*C_r^1}{C_{r+s+p}^2}\),那么状态转移方程是

\[sum=sr+pr+sp
\]

\[dp[i-1][j][k]+=dp[i][j][k]*\frac{C_s^1*C_r^1}{sum}
\]

\[dp[i][j-1][k]+=dp[i][j][k]*\frac{C_p^1*C_r^1}{C_{sum}^2}
\]

\[dp[i][j][k-1]+=dp[i][j][k]*\frac{C_p^1*C_s^1}{C_{sum}^2}
\]

从头开始递推即可。

最后统计答案的时候统计dp[i][j][0]这种的答案,因为这种答案的胜负已定,只能存在一个物种

代码:

#include <iostream>
#include <iomanip>
#define max_n 105
using namespace std;
int r,s,p;
double dp[max_n][max_n][max_n];
int main()
{
cin >> r >> s >> p;
dp[r][s][p] = 1.0;
for(int i = r;i>0;i--)
{
for(int j = s;j>0;j--)
{
for(int k = p;k>0;k--)
{
double sum = i*j+i*k+j*k;
dp[i-1][j][k] += dp[i][j][k]*(double)(i*k)/sum;
dp[i][j-1][k] += dp[i][j][k]*(double)(i*j)/sum;
dp[i][j][k-1] += dp[i][j][k]*(double)(j*k)/sum;
}
}
}
double ans1 = 0;
double ans2 = 0;
double ans3 = 0;
for(int i = 0;i<=100;i++)
{
for(int j = 0;j<=100;j++)
{
ans1 += dp[i][j][0];
ans2 += dp[0][i][j];
ans3 += dp[i][0][j];
}
}
cout.setf(ios_base::fixed,ios_base::floatfield);
cout << setprecision(12) << ans1 << " " << ans2 << " " << ans3 << endl;
return 0;
}

Codeforces B. Bad Luck Island(概率dp)的更多相关文章

  1. codeforces 540D Bad Luck Island (概率DP)

    题意:会出石头.剪刀.布的人分别有r,s,p个,他们相互碰到的概率相同,输的人死掉,问最终活下去的人是三种类型的概率 设状态dp(i,j,k)为还有i个石头,j个剪刀,k个布时的概率,dp(r,s,p ...

  2. Codeforces Round #301 (Div. 2) D. Bad Luck Island 概率DP

    D. Bad Luck Island Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/540/pr ...

  3. Codeforces 540D Bad Luck Island - 概率+记忆化搜索

    [题意] 一个岛上有三种生物A,B,C,各有多少只在输入中会告诉你,每种最多100只 A与B碰面,A会吃掉B, B与C碰面,B会吃掉C, C与A碰面,C会吃掉A...忍不住想吐槽这种环形食物链 碰面是 ...

  4. cf540D. Bad Luck Island(概率dp)

    题意 岛上有三个物种:剪刀$s$.石头$r$.布$p$ 其中剪刀能干掉布,布能干掉石头,石头能干掉剪刀 每天会从这三个物种中发生一场战争(也就是说其中的一个会被干掉) 问最后仅有$s/r/p$物种生存 ...

  5. CodeForces - 540D Bad Luck Island —— 求概率

    题目链接:https://vjudge.net/contest/226823#problem/D The Bad Luck Island is inhabited by three kinds of ...

  6. CodeForces 540D Bad Luck Island (DP)

    题意:一个岛上有石头,剪刀和布,规则就不用说了,问你最后只剩下每一种的概率是多少. 析:很明显的一个概率DP,用d[i][j][k]表示,石头剩下 i 个,剪刀剩下 j 个,布剩下 k 个,d[r][ ...

  7. codeforces 148D Bag of mice(概率dp)

    题意:给你w个白色小鼠和b个黑色小鼠,把他们放到袋子里,princess先取,dragon后取,princess取的时候从剩下的当当中任意取一个,dragon取得时候也是从剩下的时候任取一个,但是取完 ...

  8. CodeForces 24D Broken robot (概率DP)

    D. Broken robot time limit per test 2 seconds memory limit per test 256 megabytes input standard inp ...

  9. Codeforces 148D Bag of mice 概率dp(水

    题目链接:http://codeforces.com/problemset/problem/148/D 题意: 原来袋子里有w仅仅白鼠和b仅仅黑鼠 龙和王妃轮流从袋子里抓老鼠. 谁先抓到白色老师谁就赢 ...

随机推荐

  1. linux 自动化安装系统 -KS文件

    # Kickstart file automatically generated by anaconda. installharddrive --partition=sdb2 --dir=lang e ...

  2. SKF密码设备研究

    SKF介绍 SKF接口是国密标准中智能密码钥匙的C语言应用开发接口标准,目前很多国内密码密码设备厂商都为其产品提供了SKF接口的开发包.开发者可以通过统一的SKF接口开发密码应用,访问来自不同设备供应 ...

  3. c语言之函数指针应用

    c语言之函数指针应用 1.函数指针与指针函数 在开始运用函数指针前,我们需要将两个概念即:函数指针与指针函数搞清楚. 函数指针,指明这个一个函数,但返回值为指针类型,语法格式为: 类型名* 函数名A( ...

  4. Spring的NamedParameterJdbcTemplate的简单使用

    原文地址:https://www.iteye.com/blog/itommy-2354746 Spring JDBC包提供了JdbcTemplate和它的两个兄弟SimpleJdbcTemplate和 ...

  5. Csp-s2019 划分

    本题主要靠结论 12pt 爆搜 时间复杂度\(O(n^n)\) 36pt \(f_{i,j}表示前i个数由状态j转移过来,a_i表示前缀和\) \(So,f_{i,j}=f_{j,k}+(a_i-a_ ...

  6. 在spring管理的类的要注意问题

    特别时写框架的时候, 注意依赖引用,类的成员变量不要随便new,看spring容器中是否管理过,new出来的时其他的对象了

  7. [转帖]Kubernetes v1.17 版本解读 | 云原生生态周报 Vol. 31

    Kubernetes v1.17 版本解读 | 云原生生态周报 Vol. 31 https://www.kubernetes.org.cn/6252.html 2019-12-13 11:59 ali ...

  8. beego:限制接口访问频率

    package utils import ( "github.com/astaxie/beego" "github.com/astaxie/beego/context&q ...

  9. 2019 ICPC 银川站

    I. Base62(高精度进制转换) 比赛当时雷菊苣和队长俩人拿着大数板子摸了一百多行(然后在缺少大数板子的情况下雷菊苣一发过了orz) 今天补题随便摸了个高精度进制转换的板子交上去就过了还贼短,, ...

  10. PHP 将字符串中的数字转化为数组

    $str ='现在是2019年11月18日下午17点25分';$result='';$arr=[];for($i=0;$i<strlen($str);$i++){ if(is_numeric($ ...