Portal -->bzoj2318

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、如果说这一步拿走石子会更优,那么有:

\[\begin{aligned}
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]\)换掉就好了,第二条式子的处理类似):

\[\begin{aligned}
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、如果说这一步不拿走石子会更优,那么有:

\[\begin{aligned}
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的更多相关文章

  1. 【BZOJ2318】Spoj4060 game with probability Problem 概率

    [BZOJ2318]Spoj4060 game with probability Problem Description Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬 ...

  2. 【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 ...

  3. 【bzoj2318】Spoj4060 game with probability Problem

    题目描述 Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬币,如果正面朝上,则从n个石子中取出一个石子,否则不做任何事.取到最后一颗石子的人胜利.Alice在投掷硬币时有 ...

  4. 【BZOJ2318】【spoj4060】game with probability Problem 概率DP

    链接: #include <stdio.h> int main() { puts("转载请注明出处[辗转山河弋流歌 by 空灰冰魂]谢谢"); puts("网 ...

  5. 【bzoj2318】Spoj4060 game with probability Problem 概率dp

    题目描述 Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬币,如果正面朝上,则从n个石子中取出一个石子,否则不做任何事.取到最后一颗石子的人胜利.Alice在投掷硬币时有 ...

  6. 【LeetCode】688. Knight Probability in Chessboard 解题报告(Python)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 题目地址:https://leetcode.com/problems/knight-pr ...

  7. 【概率论】2-1:条件概率(Conditional Probability)

    title: [概率论]2-1:条件概率(Conditional Probability) categories: Mathematic Probability keywords: Condition ...

  8. 【概率论】1-1:概率定义(Definition of Probability)

    title: [概率论]1-1:概率定义(Definition of Probability) categories: Mathematic Probability keywords: Sample ...

  9. 【原创】开源Math.NET基础数学类库使用(12)C#随机数扩展方法

                   本博客所有文章分类的总目录:[总目录]本博客博文总目录-实时更新  开源Math.NET基础数学类库使用总目录:[目录]开源Math.NET基础数学类库使用总目录 前言 ...

随机推荐

  1. asp.net 问题:Web 服务器上的请求筛选模块被配置为 拒绝包含的查询字符串过长的请求

    发现问题: post请求,在发送一个图片base64编码的字符串时,服务端报这个错误. 报错信息中给出了解决办法: 最可能的原因: Web 服务器上的请求筛选被配置为拒绝该请求,因为查询字符串过长. ...

  2. Qt-QML-电子罗盘

    使用QML中的Canvas实现电子罗盘绘制,效果图如下 一个简单的电子罗盘,红色N极.其中中间飞机表示当前的指向, 还是比较简单的,直接上代码吧 /* 作者:张建伟 时间:2018年4月27日 简述: ...

  3. Windows下Mongodb安装部署

    1.下载安装包 mongodb-win32-x86_64-enterprise-windows-64-3.6.4.zip 解压 安装失败(当前环境windows server2012 R2):已验证可 ...

  4. Phaser游戏框架与HTML Dom元素之间的通信交互

    本想按照PHASER的HTML Dom元素官方实例:http://labs.phaser.io/index.html?dir=game%20objects/dom%20element/&q=  ...

  5. 使用JS验证文件类型

    项目中涉及到这一需求,在此贴出代码分享给大家, 有2中方式,一种是input中使用accept 方式 一种是使用js正则表达式判断,个人推荐使用js正则表达式,因为accept 有的浏览器并不支持,而 ...

  6. libCurl 初步认识 - cur easy

    cur easy接口简洁明了,主接口4个,辅接口5个. 主接口 初始化 + 配参数 + 执行 + 销毁 初始化 CURL* curl_easy_init() 获得CURL句柄,返回值需要判空. 配参数 ...

  7. C++寒假计划

    课程 西北工业大学的c++程序设计 理由 这个课程里的内容都比较详细,能比较全面的讲解C++,我们是从C过渡到C++的,所以我之前看了阚道洪的面向对象程序设计的课程,他讲解了两者的差别,还有C++对C ...

  8. 我是IT小小鸟读书笔记

    阅读了我是IT小小鸟后发现,自己开发程序是真的很苦难的,在现在这个空对空的时期,我们学习到大部分的全都是理论知识,而没有真正的去进行实践.没有经过实践,我们在程序开发过程中也就无法发现自身的困难. 在 ...

  9. php addslashes和stripslashes函数

    addslashes — 使用反斜线引用字符串 stripslashes — 反引用一个引用字符串   Example #1 一个 addslashes() 例子 <?php$str = &qu ...

  10. Rsyslog的模板template详解

    一. Template功能 根据用户需求指定任意格式 动态生成文件名 每个输出都使用了一些模板,包括针对文件的,针对用户消息等 备注: 旧版本:$template 新版本:template() V6之 ...