game with probability problem
两个人 A, B 取 n 枚石子,祂们轮流抛硬币 (A 先手),每次抛硬币,如果是正面,就取出一枚石子,否则什么都不做,然而 A, B 有一种超能力,在抛硬币前在意志中确定一面 (正面或反面),然后就有 pA 或 pB 的概率抛出意志中的那一面 (当然,常人的 p = 0.5)。取得最后一枚石子的人获胜。假如 A, B 都采取最佳策略,求 A 获胜的概率,其中 pA, pB ≥ 0.5,n ≤ 108,精度 6 位小数。
这道题好难啊。。用全概率公式做。
设$f_i$为剩下i枚石子,A先手,A获胜的概率。$g_i$为剩下i枚石子,B先手,A获胜的概率。显然$f_0=0$,$g_0=1$。
令事件X表示剩下i枚石子,A先手且获胜。事件Y表示剩下i枚石子,A抛硬币抛到正面。显然硬币只有两面,所以$A$和$\overline{A}$是$\Omega$的完备事件组。
因为如果抛到正面,那么A获胜的概率就是有i-1枚棋子,B先手,A获胜的概率,所以:$p(X\mid Y)=g_{i-1}$,$p(X\mid Y)=g_i$。那么根据全概率公式$p(X)=p(X\mid Y)p(Y)+p(X\mid \overline Y)p(\overline Y)=p(Y)g_{i-1}+p(\overline Y)g_i$。p(Y)是A抛到正面的概率,也就是要根据A想不想抛到正面来改变。暂时记$p(Y)=P_{A'}$,则$f_i=p(X)=P_{A'}g_{i-1}+(1-P_{A'})g_i$。同理,$g_i=P_{B'}f_{i-1}+(1-P_{B'})f_i$。然后联立方程组(我们要让方程组里不包含下标为i的东西,这是dp的原则),可得:$$f_i=\frac{P_{A'}g_{i-1}+(1-P_{A'})P_{B'}f_{i-1}}{P_{A'}+P_{B'}-P_{A'}P_{B'}}$$
那么现在来考虑$P_{A'}$和$P_{B'}$。来看$P_{A'}$。明显,如果$g_{i-1}>g_i$,代入一下前面$g_i$的等式,可得如果$f_{i-1}<g_{i-1}$,A想抛正面(算一算,很凑巧),所以$P_{A'}=p(A)$。$f_{i-1}>g_{i-1}$时A想抛反面,所以$P_{A'}=1-p(A)$,同理也可以推出$P_{B'}$的。
#include <cstdio>
using namespace std; const int maxn=1e6+;
int t, n;
double f[maxn], g[maxn];
double pa, pb, panow, pbnow, tmp; int main(){
scanf("%d", &t);
for (int tt=; tt<t; ++tt){
scanf("%d%lf%lf", &n, &pa, &pb);
if (n>1e6) n=1e6;
f[]=, g[]=;
for (int i=; i<=n; ++i){
if (f[i-]!=g[i-]){
if (f[i-]<g[i-])
panow=pa, pbnow=pb;
else panow=-pa, pbnow=-pb;
tmp=panow+pbnow-panow*pbnow;
f[i]=(panow*g[i-]+(-panow)*pbnow*f[i-])/tmp;
g[i]=(pbnow*f[i-]+(-pbnow)*panow*g[i-])/tmp;
} else f[i]=g[i]=f[i-]=g[i-];
}
printf("%0.6lf\n", f[n]);
}
return ;
}
game with probability problem的更多相关文章
- 【BZOJ2318】Spoj4060 game with probability Problem 概率
[BZOJ2318]Spoj4060 game with probability Problem Description Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬 ...
- HDU 4978 A simple probability problem
A simple probability problem Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K ( ...
- BZOJ 2318: Spoj4060 game with probability Problem( 概率dp )
概率dp... http://blog.csdn.net/Vmurder/article/details/46467899 ( from : [辗转山河弋流歌 by 空灰冰魂] ) 这个讲得很好 , ...
- BZOJ2318: Spoj4060 game with probability Problem
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #i ...
- 【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 ...
- 2318: Spoj4060 game with probability Problem
2318: Spoj4060 game with probability Problem Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 356 Sol ...
- Bzoj 2318 Spoj4060 game with probability Problem
2318: Spoj4060 game with probability Problem Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 524 Sol ...
- BZOJ 2318: Spoj4060 game with probability Problem (概率dp)(博弈论)
2318: Spoj4060 game with probability Problem Description Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬币,如果 ...
- 【bzoj2318】Spoj4060 game with probability Problem
题目描述 Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬币,如果正面朝上,则从n个石子中取出一个石子,否则不做任何事.取到最后一颗石子的人胜利.Alice在投掷硬币时有 ...
- hdu4987A simple probability problem.(凸包)
链接 多校的最后一场,当时没看懂题意,看题目还以为是概率问题就没深看. 官方题解 对于他说的第一种,考虑长为L的线段 概率为2L/(pi*d), 可以理解,下面的就不知道在说啥了.. 按我初始的想法想 ...
随机推荐
- Java_io_02_从一个目录拷贝文件到另一个目录下
java从一个目录拷贝文件到另一个目录下 http://www.cnblogs.com/langtianya/p/4857524.html ** * 复制单个文件 * @param oldPath ...
- 不得不存!UI设计新手不可错过的7条实用法则
http://www.gameres.com/316761.html 本文编译自 Medium,作者是一位UX(User Experience, 用户体验)设计师,他通过自己学习UI设计的过程,总结出 ...
- windows下安装 postgresql
1. 下载PostgreSQL的源代码.解压. 2. 在Windows平台下编译需要跳过一个权限的检测,否则在编译的时候可能会出现错误. 在\src\backend\main\main.c文件中将 ...
- C++函数重载详解
我们在开瓶瓶罐罐的时候,经常会遭遇因各种瓶口规格不同而找不到合适的工具的尴尬.所以有时候就为了开个瓶,家里要备多种规格的开瓶器.同样是开个瓶子嘛,何必这么麻烦?于是有人发明了多功能开瓶器,不管啤酒瓶汽 ...
- Guava手记
Cache Guava的Cache封装的功能比较全面,但是很多地方和设想的不太一样,最明显的就是RemovalListener,它并不是invalid之后就会被调用,因为在调用Cache的invali ...
- [转] 更新Flash CS6发布设置的目标播放器版本
目前Aodbe发布的最新版的Flash CS6,都不支持将Flash Player 11作为目标播放器版本发布.这个问题很容易解决,但涉及到的东西却比较多,我在这里将一一讲解.首先来个Setp by ...
- HDOJ5044(最近公共祖先)
#include<cstdio> #include<cstring> using namespace std; ; struct Edge{ int v,id,next; }e ...
- HDOJ1171(多重背包)
#include<iostream> #include<cstdio> using namespace std; #define MAX(a,b) (a>b)?a:b + ...
- Python:easygui的安装、导入、使用、设置
转于:https://blog.csdn.net/sinat_37390744/article/details/55211652 博主:钏的博客 一.下载安装 1)下载0.96的easygui.htt ...
- 问题13:如何在for语句中迭代多个可迭代的对象
from random import randint a1 = [randint(10, 50) for _ in range(5)] a2 = [randint(10, 50) for _ in r ...