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^]);
}
}

BZOJ 2318: Spoj4060 game with probability Problem (概率dp)(博弈论)的更多相关文章

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

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

  2. Bzoj 2318 Spoj4060 game with probability Problem

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

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

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

  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. 【BZOJ2318】Spoj4060 game with probability Problem 概率

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

  7. 【BZOJ2318】【spoj4060】game with probability Problem 概率DP

    链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...

  8. BZOJ2318: Spoj4060 game with probability Problem

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

  9. 【bzoj2318】Spoj4060 game with probability Problem

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

随机推荐

  1. QMainWindow的空间布局结构

    简单讲一下Qt的QMainWindow的结构,Qt的顶级窗口有三种类型,首先是万恶之源(...应该说是大部分控件的父类...)的QWidget,然后是QMainWidget和QDialog,后面两者也 ...

  2. MYSQL连接不上100061错误

    有界面的情况下启动MYSQL 无界面 https://blog.csdn.net/qq_22233621/article/details/72673176 参考

  3. 关于域名转发proxy_pass

    在配置nginx的时候,有一个需求,访问m.XXX.com的时候,需要实际访问www.YYY.com/m,并且域名不能发生变化. 达成这个需求有两种做法: 第一种就是301跳转,使用rewrite来跳 ...

  4. 视频课程 | Kubernetes的兴起

    视频课程 | Kubernetes的兴起 原创: 京小云 京东云开发者社区  4月3日 京东云开发者社区在3月底于北京举行了以"Cloud Native时代的应用之路与开源创新"为 ...

  5. bootstrap 网格

    实现原理 网格系统的实现原理非常简单,仅仅是通过定义容器大小,平分12份(也有平分成24份或32份,但12份是最常见的),再调整内外边距,最后结合媒体查询,就制作出了强大的响应式网格系统.Bootst ...

  6. jupyter notebook 安装配置使用,+目录插件安装

    1.安装 pip3 install jupyter 2.配置 2.1. 生成一个 notebook 配置文件 jupyter notebook --generate-config /root/.jup ...

  7. 【PS学习成果】手持雷电

    结合网上的教程和素材,试试水. 备注申明:图片和教程 均来自网络PS家园网(www.psjia.com),如有侵权,请联系本人,马上删除.

  8. vue多选验证

    vue select 多选 验证 <FormItem :prop="'formList.'+index+'.name'" label="姓名" :rule ...

  9. idea代理上网

    idea 代理上网 浏览器能够上网,idea无法下载jar 浏览器无法上网则配置浏览器代理 --------- start //------------------------浏览器代理完毕 idea ...

  10. mybatis框架快速入门

    通过快速入门示例,我们发现使用mybatis 是非常容易的一件事情,因为只需要编写 Dao 接口并且按照 mybatis要求编写两个配置文件,就可以实现功能.远比我们之前的jdbc方便多了.(我们使用 ...