【bzoj2318】game with probability
Description
Alice和Bob在玩一个游戏。有n个石子在这里,Alice和Bob轮流投掷硬币,如果正面朝上,则从n个石子中取出一个石子,否则不做任何事。取到最后一颗石子的人胜利。Alice在投掷硬币时有p的概率投掷出他想投的一面,同样,Bob有q的概率投掷出他相投的一面。
现在Alice先手投掷硬币,假设他们都想赢得游戏,问你Alice胜利的概率为多少。
答案保留6位小数
数据范围$1<=t<=50,0.5<=q,p<=0.99999999,1<=n<=99999999 $
Solution
额这题也是权限题放一下题面好了
这个的话一开始自己想多了。。老觉得会不会说为了最优决策所以Alice为了有更大的概率得到想要的结果而故意想相反的结果之类的。。
emmm后来发现Alice和Bob根本不知道概率是多少所以根本不存在这个问题qwq
那所以我们可以考虑直接两个数组大力dp
记\(f[i]\)为\(i\)个石子的情况下Alice(先手)的胜率,\(g[i]\)为\(i\)个石子的情况下Bob(后手)的胜率
那么我们可以得到这样的两种转移:
1、如果说这一步拿走石子会更优,那么有:
f[i]=p*g[i-1]+(1-p)*g[i]\\
g[i]=q*f[i-1]+(1-q)*f[i]\\
\end{aligned}
\]
具体一点的话以\(f[i]\)的计算为例,前半部分是第一步Alice拿了,然后局面就变成了有\(i-1\)个石头并且是后手,所以乘的是\(g[i-1]\),然后后半部分就是第一步Alice没有拿,那就变成了有\(i\)个石头并且是后手,所以是乘上\(g[i]\),第二条式子同理就不赘述了
然后我们大力化一下可以将这两条式子变成用\(f[i-1]\)和\(g[i-1]\)推出\(f[i]\)和\(g[i]\)的式子
(用\(g[i]\)的表达式把第一条式子里面的\(g[i]\)换掉就好了,第二条式子的处理类似):
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)}\\
\end{aligned}
\]
2、如果说这一步不拿走石子会更优,那么有:
f[i]=p*g[i]+(1-p)*g[i-1]\\
g[i]=q*f[i]+(1-q)*f[i-1]\\
\end{aligned}
\]
具体含义什么的跟上面的差不多
仔细看一下emmmm那好像直接就是\(p\)变成了\(1-p\)然后\(q\)变成了\(1-q\)而已。。所以转移的时候判断一下就好了
那现在就是怎么判断是拿更优还是不拿更优,仔细思考一下这个拿和不拿其实影响到的是接下来局面的先手后手问题,所以我们就比较一下\(i-1\)个石子的情况下是先手的胜率更大还是后手的胜率更大就好了,也就是直接比较一下\(f[i-1]\)和\(g[i-1]\)即可
然后还有一个东西就是。。推大概到\(1000\)之后(额或者更小一点也行qwq貌似只推到\(50\)也。。问题不大?没有交过qwq)在精度范围内就不会有变化了,所以大力“近似”一下每次只用推到\(1000\),这样就不会有超时的问题啦(算是一个套路吗。。?)
代码大概长这个样子:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N=1001;
double f[N],g[N];
double p,q,P,Q;
int n,m,t;
int main(){
#ifndef ONLINE_JUDGE
freopen("a.in","r",stdin);
#endif
scanf("%d",&t);
for (int o=1;o<=t;++o){
scanf("%d%lf%lf",&n,&P,&Q);
n=min(n,1000);
f[0]=0; g[0]=1;
for (int i=1;i<=n;++i){
if (f[i-1]>g[i-1]) p=1.0-P,q=1.0-Q;
else p=P,q=Q;
f[i]=(p*g[i-1]+(1-p)*q*f[i-1])/(1-(1-p)*(1-q));
g[i]=(q*f[i-1]+(1-q)*p*g[i-1])/(1-(1-p)*(1-q));
}
printf("%.6lf\n",f[n]);
}
}
【bzoj2318】game with probability的更多相关文章
- 【BZOJ2318】Spoj4060 game with probability Problem 概率
[BZOJ2318]Spoj4060 game with probability Problem Description Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬 ...
- 【leetcode】688. Knight Probability in Chessboard
题目如下: On an NxN chessboard, a knight starts at the r-th row and c-th column and attempts to make exa ...
- 【bzoj2318】Spoj4060 game with probability Problem
题目描述 Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬币,如果正面朝上,则从n个石子中取出一个石子,否则不做任何事.取到最后一颗石子的人胜利.Alice在投掷硬币时有 ...
- 【BZOJ2318】【spoj4060】game with probability Problem 概率DP
链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...
- 【bzoj2318】Spoj4060 game with probability Problem 概率dp
题目描述 Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬币,如果正面朝上,则从n个石子中取出一个石子,否则不做任何事.取到最后一颗石子的人胜利.Alice在投掷硬币时有 ...
- 【LeetCode】688. Knight Probability in Chessboard 解题报告(Python)
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/knight-pr ...
- 【概率论】2-1:条件概率(Conditional Probability)
title: [概率论]2-1:条件概率(Conditional Probability) categories: Mathematic Probability keywords: Condition ...
- 【概率论】1-1:概率定义(Definition of Probability)
title: [概率论]1-1:概率定义(Definition of Probability) categories: Mathematic Probability keywords: Sample ...
- 【原创】开源Math.NET基础数学类库使用(12)C#随机数扩展方法
本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新 开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...
随机推荐
- perf + 火焰图用法 小结
要对新服务做性能测试,分析代码热点,初识perf,做下总结 perf + 火焰图用法 perf简介 Perf (Performance Event), Linux 系统原生提供的性能分析工具, 会返回 ...
- idea下增加scala
1 idea工具下,下载scala插件 2 idea下新建scala工程 File——New——module 如果按照上图,设置后点击下载,出现下图下载过慢情况下, 这里我选择了等待,大概等了半小时才 ...
- 【坚持】Selenium+Python学习之从读懂代码开始 DAY2
2018/05/10 [来源:菜鸟教程](http://www.runoob.com/python3/python3-examples.html) #No.1 # 二次方程式 ax**2 + bx + ...
- Zabbix部署-LNMP环境
原文发表于cu:2016-05-05 参考文档: LNMP安装:http://www.osyunwei.com/archives/7891.html 一.环境 Server:CentOS-7-x86_ ...
- 论文笔记:Fully-Convolutional Siamese Networks for Object Tracking
Fully-Convolutional Siamese Networks for Object Tracking 本文作者提出一个全卷积Siamese跟踪网络,该网络有两个分支,一个是上一帧的目标,一 ...
- Pearson Distance
Pearson Distance: where: 1. is the covariance 2. is the standard deviation of 3. is the standard ...
- Redis 指令
一个key可以存放将近40亿条数据 选择库 select 2 (代表选择第三个库) 增加key set db_number 11 删除key del key 获取值 get db_n ...
- mysql 性能优化 20 条建议
MySQL性能优化的最佳20+条经验 2009年11月27日陈皓发表评论阅读评论100,946 人阅读 今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显.关于数据库的性 ...
- CF刷刷水题找自信1
CF 1108A Two distinct points 题目意思:给你两个线段的起点和终点,让你给出两个不同的点,这两点分别处于两个不同的线段之中.解题思路:题目说如果存在多种可能的点,随意一组答案 ...
- vim 编码方式的设置
和所有的流行文本编辑器一样,Vim 可以很好的编辑各种字符编码的文件,这当然包括UCS-2.UTF-8 等流行的 Unicode 编码方式.然而不幸的是,和很多来自 Linux 世界的软件一样,这需要 ...