【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基础数学类库使用总目录 前言 ...
随机推荐
- Jmeter性能测试使用记录
使用背景 由于最近公司要求对一批接口做性能测试,所以重拾了一些对于Jmeter的使用,现将部分过程做记录,以便以后回溯. 接口参数化 数据参数文件使用了excel保存出的csv文件,dat格式的文件也 ...
- 【转】AOE机制的DSL及其实际运用
AOE这个词的意思,我相信玩过WOW的人都不陌生,包括玩过LoL的也不会陌生,说穿了就是一个区域内发生效果(Area of effect).这里我们要讨论的就是关于一个适合于几乎所有游戏的AOE机制, ...
- 常用的os操作方法
os.sep可以取代操作系统特定的路径分隔符.windows下为 “”os.name字符串指示你正在使用的平台.比如对于Windows,它是'nt',而对于Linux/Unix用户,它是'posix' ...
- USACO 1.5.4 Checker Challenge跳棋的挑战(回溯法求解N皇后问题+八皇后问题说明)
Description 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行,每列,每条对角线(包括两条主对角线的所有对角线)上都至多有一个棋子. 列号 0 1 2 3 4 5 6 ...
- scrum立会报告+燃尽图(第三周第六次)
此作业要求参见:https://edu.cnblogs.com/campus/nenu/2018fall/homework/2286 项目地址:https://coding.net/u/wuyy694 ...
- 用P4对数据平面进行编程
引言 SDN架构强调了对控制平面的可编程,数据平面只负责转发,导致数据平面很大程度上受制于功能固定的包处理硬件. P4语言的特性: 目标无关性:P4语言不受制于具体设备,所有可编程芯片都可以使用P4编 ...
- HDU 5861 Road 线段树区间更新单点查询
题目链接: http://acm.split.hdu.edu.cn/showproblem.php?pid=5861 Road Time Limit: 12000/6000 MS (Java/Othe ...
- ZOJ 3946 Highway Project 贪心+最短路
题目链接: http://www.icpc.moe/onlinejudge/showProblem.do?problemCode=3946 题解: 用dijkstra跑单元最短路径,如果对于顶点v,存 ...
- LAMP 系统服务搭建过程详解
LAMP 架构在企业里用得非常广泛,目前很多电商公司.游戏公司.移动互联网公司大多都采用这种架构.LAMP指的是Linux.Apache.MySQL.PHP.下面记录了 LAMP 架构系统服务的搭建过 ...
- vim 简单用法
vim 是一个纯文本编辑器 模式化的编辑器 1:编辑模式2:输入模式3:末行模式 : 具有命令的接口,在末行模式中可以直接的通过命令修改vim编辑器打开的文本文件 模式转换 1:编辑模式—>输入 ...