Bzoj 2318 Spoj4060 game with probability Problem
2318: Spoj4060 game with probability Problem
Time Limit: 1 Sec Memory Limit: 128 MB
Submit: 524 Solved: 262
[Submit][Status][Discuss]
Description
Alice和Bob在玩一个游戏。有n个石子在这里,Alice和Bob轮流投掷硬币,如果正面朝上,则从n个石子中取出一个石子,否则不做任何事。取到最后一颗石子的人胜利。Alice在投掷硬币时有p的概率投掷出他想投的一面,同样,Bob有q的概率投掷出他相投的一面。
现在Alice先手投掷硬币,假设他们都想赢得游戏,问你Alice胜利的概率为多少。
Input
第一行一个正整数t,表示数据组数。
对于每组数据,一行三个数n,p,q。
Output
对于每组数据输出一行一个实数,表示Alice胜利的概率,保留6位小数。
Sample Input
1 0.5 0.5
Sample Output
HINT
数据范围:
1<=t<=50
0.5<=p,q<=0.99999999
对于100%的数据 1<=n<=99999999
一道无比有趣的概率题……
我们设f[i]为当前有i张牌且我们当前所针对人物为先手的获胜概率,g[i]为后手获胜概率。
那么,我们先考虑一下选择希望翻正面的概率的递推式。
f[i]=p*g[i-1]+(1-p)*g[i]
因为我们有p的几率将当前局面改为后手、场上有i-1张牌,1-p的几率将局面改为g[i]所以我们上述递推式正确的。g[i]也是如此。
g[i]=q*f[i-1]+(1-q)*f[i]
为什么这里变为q呢?因为当前我们希望翻正面一定是因为g[i-1]>f[i-1],而这个概率对于谁都是一样的,所以bob也一定是想要去翻正面,所以改为q。
虽然这样我们好像还是无法推出来啊。所以我们要去解一下方程组,反正不就是一个二元一次吗?手解一下不就好了,应该不用高斯消元吧……
至于希望翻反面,请读者自己思考,答案就在代码里(当然不是原始状态啦)。
有意思的是虽然他的n很大,但是他并未对精度要求太高,所以我们只要等到他的精度卡到一定地步直接跳出就好了。
我一开始是直接判断精度,但是貌似T了,所以看别人算到1000就行了……
#include <iostream>
#include <cstdlib>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <map>
#include <set>
#include <vector>
#define N 1005
using namespace std;
int t,n;
double p,q,f[N],g[N];
int main()
{
scanf("%d",&t);
while(t--)
{
scanf("%d%lf%lf",&n,&p,&q);
memset(f,,sizeof(f));
memset(g,,sizeof(g));
g[]=;
n=min(n,);
for(int i=;i<=n;i++)
{
if(f[i-]<g[i-])
{
f[i]=(p*g[i-]+(1.0-p)*q*f[i-])/(p+q-p*q);
g[i]=(q*f[i-]+(1.0-q)*p*g[i-])/(p+q-p*q);
}
else
{
f[i]=(p*(1.0-q)*f[i-]+(1.0-p)*g[i-])/(1.0-p*q);
g[i]=((1.0-q)*f[i-]+q*(1.0-p)*g[i-])/(1.0-p*q);
} }
printf("%.6lf\n",f[n]);
}
return ;
}
Bzoj 2318 Spoj4060 game with probability Problem的更多相关文章
- BZOJ 2318: Spoj4060 game with probability Problem( 概率dp )
概率dp... http://blog.csdn.net/Vmurder/article/details/46467899 ( from : [辗转山河弋流歌 by 空灰冰魂] ) 这个讲得很好 , ...
- BZOJ 2318: Spoj4060 game with probability Problem (概率dp)(博弈论)
2318: Spoj4060 game with probability Problem Description Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬币,如果 ...
- 【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 ...
- BZOJ2318: Spoj4060 game with probability Problem
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #i ...
- 【BZOJ2318】Spoj4060 game with probability Problem 概率
[BZOJ2318]Spoj4060 game with probability Problem Description Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬 ...
- 【bzoj2318】Spoj4060 game with probability Problem
题目描述 Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬币,如果正面朝上,则从n个石子中取出一个石子,否则不做任何事.取到最后一颗石子的人胜利.Alice在投掷硬币时有 ...
- 【bzoj2318】Spoj4060 game with probability Problem 概率dp
题目描述 Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬币,如果正面朝上,则从n个石子中取出一个石子,否则不做任何事.取到最后一颗石子的人胜利.Alice在投掷硬币时有 ...
- Spoj4060 game with probability Problem
题目链接:Click here Solution: 刚开始还以为博弈论加概率,然而并不是... 设两个状态:\(f(i)\)表示当前剩下\(i\)个石头时,先手的获胜概率,\(g(i)\)为后手的获胜 ...
随机推荐
- php 获取今日、昨日、本周,上周、本月,上月,季度的起始时间戳和结束时间戳的方法
php 获取今日.昨日.上周.本月的起始时间戳和结束时间戳的方法,主要使用到了 php 的时间函数 mktime.下面首先还是直奔主题以示例说明如何使用 mktime 获取今日.昨日.上周.本月的起始 ...
- CenOS7 docker部署lnmp环境
Step1:下载lnmp镜像 [root@docker html]# docker pull winstonpro/lnmp Step2:启动lnmp镜像的docker实例 [root@docker ...
- vs2017 cordova调试android app
方案是:virtualbox + androidx86 7.0+_x64.iso虚拟机方式
- Cannot read property 'apply' of undefined
...TypeError: Cannot read property 'apply' of undefined :一般都是作用域不对 ...TypeError: Cannot read propert ...
- 判断jQuery选择器结果为空 - CSDN博客
原文:判断jQuery选择器结果为空 - CSDN博客 jQuery选择器获取到的是一个对象,所以无论页面上存在或者不存在元素,这个对象都不为空.因此,如果要使用jQuery检查元素再给某个页面上是否 ...
- 【Python】:用python做下百度2014笔试题
国庆节最后一天,明天就要上班了,闲来无事做做百度2014笔试题,好久没用过C++了,索性就用python简单的写一下,体验下题目难度.题目是从[大卫David]那里copy过来的. 1.给定任意一个正 ...
- How to trim and edit videos in Photos for OS X
Don't let the name fool you, Photos for OS X also stores all your videos. Whether you synced them fr ...
- 深入解析Windows窗口创建和消息分发(三个核心问题:怎么将不同的窗口过程勾到一起,将不同的hwnd消息分发给对应的CWnd类去处理,CWnd如何简单有效的去处理消息,由浅入深,非常清楚) good
笔记:争取不用看下面的内容,只看自己的笔记,就能记住这个流程,就算明白了: _tWinMain-->AfxWinMain,它调用四个函数: -->AfxWinInit用于做一些框架的初始化 ...
- CEGUI 0.7.7 VS2010+SP3 编译过程
1 在官方网站http://www.cegui.org.uk/ 下载最新的CEGUI 源代码 版本是0.7.7 2 下载编译需要用到的依赖文件包 将解压后的文件夹 Dependencies 和CEGU ...
- Jstack线程状态BLOCKED/TIMED_WAITING/WAITING解释
一.线程5种状态 新建状态(New) 新创建了一个线程对象. 就绪状态(Runnable) 线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运行,等待获 ...