题目链接:Click here

Solution:

刚开始还以为博弈论加概率,然而并不是...

设两个状态:\(f(i)\)表示当前剩下\(i\)个石头时,先手的获胜概率,\(g(i)\)为后手的获胜概率(注:先后手定义参照博弈论。。。)

我们再设\(p'\)表示\(A\)抛硬币为正面朝上的概率,\(q'\)表示\(B\)抛硬币为正面朝上的概率,则易得转移式:

\[f(i)=p'g(i-1)+(1-p')g(i)\\
g(i)=q'f(i-1)+(1-q')f(i)
\]

现在我们是不能直接进行dp的,因为方程中存在与它同阶段的值,则我们需要进行转化

\[f(i)=p'g(i-1)+(1-p')(q'f(i-1)+(1-q')f(i))\\
f(i)=p'g(i-1)+(q'f(i-1)+(1-q')f(i))-p'(q'f(i-1)+(1-q')f(i))\\
f(i)=p'g(i-1)+q'f(i-1)+(1-q')f(i)-p'q'f(i-1)-p'(1-q')f(i)\\
f(i)=p'g(i-1)+q'f(i-1)-p'q'f(i-1)+(1-p')(1-q')f(i)\\
f(i)=\frac{p'g(i-1)+q'(1-p')f(i-1)}{1-(1-p')(1-q')}
\]

类似的,我们同样可以得到关于\(g(i)\)的式子:

\[g(i)=\frac{q'f(i-1)+p'(1-q')g(i-1)}{1-(1-p')(1-q')}
\]

则这就是最终的转移方程式,但是,我们的\(p'q'\)的定义是不同于题目给定的\(pq\)的,则我们需要具体分情况讨论:

当\(f(i-1)>g(i-1)\)时,明显的,\(A\)不希望拿走石头,\(B\)也不希望拿走石头,则他们都希望硬币反面朝上

当\(f(i-1)<g(i-1)\)时,\(A\)是希望拿走石头的,\(B\)也是希望拿走石头的,则他们都希望硬币正面朝上

到这里,我们还是有一个问题并没有解决,就是\(n\)过于大,事实上,\(n\)越大,概率越趋向于一个定值,而题目只要求保留6位数,则我们只要让\(n\)到1000就行了QAQ

Code:

#include<bits/stdc++.h>
using namespace std;
const int N=1001;
int n;double q,p,f[N],g[N];
double rev(double x){return 1.0-x;}
int read(){
int x=0,f=1;char ch=getchar();
while(!isdigit(ch)){if(ch=='-')f=-1;ch=getchar();}
while(isdigit(ch)){x=x*10+ch-48;ch=getchar();}
return x*f;
}
int main(){
int T=read();
while(T--){
n=read();
scanf("%lf%lf",&p,&q);
f[0]=0,g[0]=1;n=min(n,N-1);
for(int i=1;i<=n;i++){
double gl1=p,gl2=q;
if(f[i-1]>g[i-1]) gl1=rev(gl1),gl2=rev(gl2);
f[i]=(1.0*gl2*(1.0-gl1)*f[i-1]+gl1*g[i-1])/(1-rev(gl1)*rev(gl2));
g[i]=(1.0*gl1*(1.0-gl2)*g[i-1]+gl2*f[i-1])/(1-rev(gl1)*rev(gl2));
}printf("%.6lf\n",f[n]);
}return 0;
}

Spoj4060 game with probability Problem的更多相关文章

  1. 【BZOJ2318】Spoj4060 game with probability Problem 概率

    [BZOJ2318]Spoj4060 game with probability Problem Description Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬 ...

  2. BZOJ 2318: Spoj4060 game with probability Problem( 概率dp )

    概率dp... http://blog.csdn.net/Vmurder/article/details/46467899 ( from : [辗转山河弋流歌 by 空灰冰魂] ) 这个讲得很好 , ...

  3. BZOJ2318: Spoj4060 game with probability Problem

    #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #i ...

  4. 【BZOJ 2318】 2318: Spoj4060 game with probability Problem(概率DP)

    2318: Spoj4060 game with probability Problem Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 371  Sol ...

  5. 2318: Spoj4060 game with probability Problem

    2318: Spoj4060 game with probability Problem Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 356  Sol ...

  6. Bzoj 2318 Spoj4060 game with probability Problem

    2318: Spoj4060 game with probability Problem Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 524  Sol ...

  7. BZOJ 2318: Spoj4060 game with probability Problem (概率dp)(博弈论)

    2318: Spoj4060 game with probability Problem Description Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬币,如果 ...

  8. 【bzoj2318】Spoj4060 game with probability Problem

    题目描述 Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬币,如果正面朝上,则从n个石子中取出一个石子,否则不做任何事.取到最后一颗石子的人胜利.Alice在投掷硬币时有 ...

  9. 【bzoj2318】Spoj4060 game with probability Problem 概率dp

    题目描述 Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬币,如果正面朝上,则从n个石子中取出一个石子,否则不做任何事.取到最后一颗石子的人胜利.Alice在投掷硬币时有 ...

随机推荐

  1. Angular5 *ngIf 和 hidden 的区别

    问题 项目中遇到一个问题,有一个过滤查询的面板,需要通过一个展开折叠的button,来控制它的show 和 hide.这个面板中,有一个Select 组件,一个 input 查询输入框. 原来代码是: ...

  2. selenium学习-模拟键盘按键操作

    导入  from selenium.webdriver.common.keys import Keys  格式:Keys.XXX 一般这么用:send_keys(Keys.XXX) # coding= ...

  3. Virtual DOM和snabbdom.js

    Virtual DOM和snabbdom.js:https://www.jianshu.com/p/1f1ef915e83e

  4. java实现整数计算器

    计算器代码 package stack; import java.util.ArrayList; import java.util.List; import java.util.Scanner; im ...

  5. HDU-4507-吉哥系列故事-恨7不成妻

    题目描述 单身! 依然单身! 吉哥依然单身! DS级码农吉哥依然单身! 所以,他生平最恨情人节,不管是214还是77,他都讨厌! 吉哥观察了214和77这两个数,发现: 2+1+4=7 7+7=7*2 ...

  6. 解决IOS把数字渲染为电话号码,颜色为蓝色解决方案

    可将telephone=no,则手机号码不被显示为拨号链接<meta name="format-detection" content="telephone=no&q ...

  7. Codeforces893F_Subtree Minimum Query

    题意 给定一棵树和根,每个点有点权,强制在线询问\(x\)子树里离\(x\)距离不超过\(k\)的最小点权. 分析 权值线段树合并的套路题,dfs,以深度作为下标,点权作为值,对每个点建立一颗权值线段 ...

  8. JavaSE--抽象类、内部类、接口

    一.抽象类 当事物不能具体描述时可将事物抽象化,只对其应有的行为进行简单的描述而不进行深度具体的描述,这样就产生了抽象类,使用abstract关键字对类进行修饰内部方法也是用abstract进行描述. ...

  9. Java学习:通过Scanner读取文件

    Scanner不仅能够读取用户的键盘输入,还可以读取文件输入. 需要在创建Scanner对象的时候传入一个File对象作为参数.代码如下: import java.util.Scanner; impo ...

  10. 34、Scrapy 知识总结

      Scrapy 知识总结   1.安装   pip install wheel pip install https://download.lfd.uci.edu/pythonlibs/q5gtlas ...