BZOJ 2318: Spoj4060 game with probability Problem (概率dp)(博弈论)
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
概率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)(博弈论)的更多相关文章
- 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
2318: Spoj4060 game with probability Problem Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 524 Sol ...
- 【bzoj2318】Spoj4060 game with probability Problem 概率dp
题目描述 Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬币,如果正面朝上,则从n个石子中取出一个石子,否则不做任何事.取到最后一颗石子的人胜利.Alice在投掷硬币时有 ...
- 【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 概率
[BZOJ2318]Spoj4060 game with probability Problem Description Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬 ...
- 【BZOJ2318】【spoj4060】game with probability Problem 概率DP
链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...
- BZOJ2318: Spoj4060 game with probability Problem
#include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #i ...
- 【bzoj2318】Spoj4060 game with probability Problem
题目描述 Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬币,如果正面朝上,则从n个石子中取出一个石子,否则不做任何事.取到最后一颗石子的人胜利.Alice在投掷硬币时有 ...
随机推荐
- SpringMVC的配置文件说明
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.sp ...
- php对象:get_object_vars(), get_parent_class(),is_subclass_of(),interface_exists()
get_object_vars():获得对象的属性,以关联数组形式返回 get_parent_class():获得对象的父类 is_subclass_of():判断对象是否某类(参数2)的子类实例出的 ...
- 深入分析Java反射(八)-优化反射调用性能
Java反射的API在JavaSE1.7的时候已经基本完善,但是本文编写的时候使用的是Oracle JDK11,因为JDK11对于sun包下的源码也上传了,可以直接通过IDE查看对应的源码和进行Deb ...
- Linux系统相关命令
时间和日期 date cal 磁盘和目录空间 df du 进程信息 ps top kill 01. 时间和日期 序号 命令 作用 01 date 查看系统时间 02 cal calendar 查看日历 ...
- uWSGI调整buffer-size
https://uwsgi-docs.readthedocs.io/en/latest/Options.html#buffer-size buffer-size argument: required_ ...
- 字符串中子序列出现次数(dp)
躲藏 链接:https://ac.nowcoder.com/acm/problem/15669来源:牛客网 题目描述 XHRlyb和她的小伙伴Cwbc在玩捉迷藏游戏. Cwbc藏在多个不区分大小写的字 ...
- android测量的三种模式
测量模式有三种引用官方的解释如下 UNSPECIFIED The parent has not imposed any constraint on the child. It can be whate ...
- numpy(一)
ndarray np的一个核心类,它描述了相同类型的“项目”集合.可以使用例如N个整数来索引项目.每个项目占用相同大小的内存块, 并且所有块都以完全相同的方式解释. 如何解释数组中的每个项目由单独的数 ...
- sklearn KMeans聚类算法(总结)
基本原理 Kmeans是无监督学习的代表,没有所谓的Y.主要目的是分类,分类的依据就是样本之间的距离.比如要分为K类.步骤是: 随机选取K个点. 计算每个点到K个质心的距离,分成K个簇. 计算K个簇样 ...
- 配对t检验