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_util_02_Java判断字符串是中文还是英文
做微信开发,使用百度翻译API时,需要指定译文的语种.这就需要我们判断待翻译内容是中文还是英文,若是中文,则翻译成英文,若是英文则翻译成中文. 方法一:字符与字节的长度 依据:一个中文占两个字节,一个 ...
- T62
Forgiveness is the fragrance that the violet sheds on the heel that has crushed it.你一脚踩在紫罗兰上,它却把香味留在 ...
- leetcode 24. Swap Nodes in Pairs(链表)
Given a linked list, swap every two adjacent nodes and return its head. For example,Given 1->2-&g ...
- luogu1754卡特兰数
卡特兰数 打表 滑稽 #include<iostream> #include<cstdio> #include<algorithm> #include<cst ...
- 【Lintcode】364.Trapping Rain Water II
题目: Given n x m non-negative integers representing an elevation map 2d where the area of each cell i ...
- Mathf.Sin正弦
输入参数是弧度 Mathf.Sin public static float Sin(float f); Parameters Description Returns the sine of ang ...
- VIJOS:P1706(舞会)
描述 Arthur公司是一个等级森严的公司,它们有着严格的上司与下属的关系,公司以总裁为最高职位,他有若干个下属,他的下属又有若干个下属,他的下属的下属又有若干个下属……现接近年尾,公司组织团拜活动, ...
- 问题13:如何在for语句中迭代多个可迭代的对象
from random import randint a1 = [randint(10, 50) for _ in range(5)] a2 = [randint(10, 50) for _ in r ...
- HTTP 的若干问题
1 HTTP无状态协议和Connection:Keep-Alive容易犯的误区 HTTP无状态:无状态是指协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态.从另一方面讲,打开一个服务器上的 ...
- MODBUS TCP和MODBUS RTU的差别
TCP和RTU协议非常类似, MBAP Header长度共7个字节,分别为Transaction identifier(事务标识符),Protocol identifier(协议标识符),Length ...