2318: Spoj4060 game with probability Problem

Description

Alice和Bob在玩一个游戏。有n个石子在这里,Alice和Bob轮流投掷硬币,如果正面朝上,则从n个石子中取出一个石子,否则不做任何事。取到最后一颗石子的人胜利。Alice在投掷硬币时有p的概率投掷出他想投的一面,同样,Bob有q的概率投掷出他相投的一面。

现在Alice先手投掷硬币,假设他们都想赢得游戏,问你Alice胜利的概率为多少。

Input

第一行一个正整数t,表示数据组数。

对于每组数据,一行三个数n,p,q。

Output

对于每组数据输出一行一个实数,表示Alice胜利的概率,保留6位小数。

Sample Input

1

1 0.5 0.5

Sample Output

0.666667

HINT

数据范围:

1<=t<=50

0.5<=p,q<=0.99999999

对于100%的数据 1<=n<=99999999


传送门

概率dp的部分不难写,博弈论的策略没想出来。

设$f[i]$表示有$i$枚石子,先手获胜的概率;

$g[i]$表示有$i$枚石子,后手获胜的概率;

则当有$i+1$枚石子时:

  若$f[i]>g[i]$,则$Alice$希望在有$i$枚石子时取得先手,那么她希望这轮不取;

  否则,$Alice$希望这轮取得石子;

当Alice希望取得石子时:

  若Alice在本轮中先手,则有$p$的概率在下轮取得后手,有$1-p$的概率在本轮取得后手;

  若Alice在本轮中后手,则有$q$的概率在下轮取得先手,有$1-q$的概率在本轮取得先手;

即$$\begin{cases}f_i=p*g_{i-1}+(1-p)*g_i\\g_i=q*f_{i-1}+(1-q)*f_i\end{cases}$$

化简得$$f_i=\frac{p*g_{i-1}+(1-p)*q*f_{i-1}}{1-(1-p)*(1-q)}$$

$$g_i=\frac{q*f_{i-1}+(1-q)*p*g_{i-1}}{1-(1-p)*(1-q)}$$

当Alice不希望取得石子时:$p$和$(1-p)$ $q$和$(1-q)$取反即可

倒推dp即可。

有两个注意的点:

  n很大,数组肯定是装不下的,显然要用滚动数组。

  O(n)的时间复杂度显然是跑不过的,打表可以发现答案是收敛的,n很大的时候前6位小数已经固定了,n取min(n,100)就好。似乎是个常见的套路,还是too young,见得不够多。

 #include<cstdio>
#include<algorithm>
#define foru(i,x,y) for(int i=x;i<=y;i++)
using namespace std;
int T,n,fl;
double f[],g[],p,q,p_,q_;
int main(){
scanf("%d",&T);
while(T--){
scanf("%d%lf%lf",&n,&p,&q);
n=min(n,);
f[]=;g[]=;q_=-q;p_=-p;
int i=;
foru(j,,n){
if(f[i^]>g[i^])swap(p_,p),swap(q_,q),fl=;
f[i]=(p*g[i^]+p_*q*f[i^])/(-q_*p_);
g[i]=(q*f[i^]+q_*p*g[i^])/(-q_*p_);
if(fl==)swap(p_,p),swap(q_,q),fl=;i^=;
}
printf("%.6lf\n",f[i^]);
}
}

最新文章

  1. 图表插件Charts.js的使用
  2. [16]APUE:套接字
  3. 【BZOJ】【3157】&amp;【BZOJ】【3516】国王奇遇记
  4. Android 用ping的方法判断当前网络是否可用
  5. LDAP缓存命令
  6. 第6章 适配器模式(Adapter Pattern)
  7. RDLC(Reportview)报表
  8. 腾讯AlloyTeam正式发布omi-cli脚手架 v1.0 - 创建网站无需任何配置
  9. 【javascript】浅谈javaScript的深拷贝
  10. Vue.js指令实例
  11. python通配符之glob模块
  12. ieee文献免费下载办法
  13. (set)MG loves gold hdu6019
  14. Java日期时间,以及相互转换
  15. Python ceil() 函数
  16. js日期控件遇到的问题
  17. plsPlugin
  18. test20190308
  19. 2019 CCPC-Wannafly Winter Camp Day1 (Div2, onsite)
  20. 【转】mvc

热门文章

  1. python一个正则表达式的不解
  2. JS 日期格式化为 2020-11-01 22:33:44 格式
  3. 撤销上一次的commit
  4. BeanFactory和ApplicationContext的区别(Bean工厂和应用上下文)
  5. 01 语言基础+高级:1-2 面向对象和封装_day06【类与对象、封装、构造方法】
  6. MySQL--INSERT INTO ... ON DUPLICATE KEY UPDATE ...
  7. Python 进阶 - 面向对象
  8. CF 1130C Connect
  9. Django_前介
  10. springBoot中mybatis错误之 Property &#39;configuration&#39; and &#39;configLocation&#39; can not specified with together 解决