2318: Spoj4060 game with probability Problem

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 371  Solved: 173

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

数据范围:

1<=t<=50

0.5<=p,q<=0.99999999

对于100%的数据 1<=n<=99999999

Source

【分析】

  这种题的特点是转移成环,一般来说要消元。不过这题转台转移量少,可以手动消元。

  打了两种打法:

  1、【我自己的方法】

  f[i][0]表示0作为先手,面对i个棋子,0获胜概率。

  f[i][1]表示1作为先手,面对i个棋子,1获胜概率。

  f[i][0]=1-p*min(f[i][1],f[i-1][1])-(1-p)*max(f[i][1],f[i-1][1])

  f[i][1]=1-q*min(f[i][0],f[i-1][0])-(1-q)*max(f[i][0],f[i-1][0])

  但是这里有min和max,不能直接移项。共有四种情况,每种情况都算一下,然后判断这个min和max是否成立。

  【其实会不会有多解sm的呢?我也不清楚,但是答案肯定是符合的。。至于为什么只有答案符合,我也不会证明。但是这样是可以过的。

  【其实主要是这样判断,最值里面有不确定因素,其实判断f[i-1][0]和1-f[i-1][1]也是可以的,就不用枚举4种情况那么麻烦了

  

  代码:

  

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 1100 double f[Maxn][]; int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
double p,q;
scanf("%d%lf%lf",&n,&p,&q);
n=min(n,);
f[][]=f[][]=;
for(int i=;i<=n;i++)
{
double A0=f[i-][],A1=f[i-][],P,Q;
//x0=1-P*x1-(1-P)*A1
//x1=1-Q*x0-(1-Q)*A0
P=p,Q=q;
f[i][]=(-P+P*(-Q)*A0-(-P)*A1)/(-P*Q);
f[i][]=(-Q+Q*(-P)*A1-(-Q)*A0)/(-P*Q);
if(f[i][]<=A1&&f[i][]<=A0) continue;
P=p,Q=-q;
f[i][]=(-P+P*(-Q)*A0-(-P)*A1)/(-P*Q);
f[i][]=(-Q+Q*(-P)*A1-(-Q)*A0)/(-P*Q);
if(f[i][]<=A1&&f[i][]>=A0) continue;
P=-p,Q=q;
f[i][]=(-P+P*(-Q)*A0-(-P)*A1)/(-P*Q);
f[i][]=(-Q+Q*(-P)*A1-(-Q)*A0)/(-P*Q);
if(f[i][]>=A1&&f[i][]<=A0) continue;
P=-p,Q=-q;
f[i][]=(-P+P*(-Q)*A0-(-P)*A1)/(-P*Q);
f[i][]=(-Q+Q*(-P)*A1-(-Q)*A0)/(-P*Q);
}
printf("%.6lf\n",f[n][]);
}
return ;
}

  2、第二种方法是看别人的,代码量比我少一点。

  但是我一般不会这样表示的说。

  f[i][0]表示0面对i,0获胜概率。f[i][1]表示1面对i,0获胜概率。

  那么当f[i-1][0]>f[i-1][1],当面对i时,0肯定想拿石子,1肯定不想。

  反之不说了。

  f[i][0]=p*f[i-1][0]+(1-p)*f[i][1]

  f[i][1]=q*f[i-1][1]+(1-q)*f[i][0]

  反之

  f[i][0]=(1-p)*f[i-1][0]+p*f[i][1] 
  f[i][1]=(1-q)*f[i-1][1]+q*f[i][0]

  移项消元即可。

 #include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define Maxn 1100 double f[Maxn][]; int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
double p,q;
scanf("%d%lf%lf",&n,&p,&q);
n=min(n,);
f[][]=;f[][]=;
for(int i=;i<=n;i++)
{
double A0=f[i-][],A1=f[i-][],P,Q;
if(A0<=A1) P=-p,Q=-q;
else P=p,Q=q;
f[i][]=(A1*(-P)+A0*(-Q)*P)/(-P*Q);
f[i][]=(A0*(-Q)+A1*(-P)*Q)/(-P*Q);
}
printf("%.6lf\n",f[n][]);
}
return ;
}

2017-04-22 10:17:55

【BZOJ 2318】 2318: Spoj4060 game with probability Problem(概率DP)的更多相关文章

  1. BZOJ 2318: Spoj4060 game with probability Problem( 概率dp )

    概率dp... http://blog.csdn.net/Vmurder/article/details/46467899 ( from : [辗转山河弋流歌 by 空灰冰魂] ) 这个讲得很好 , ...

  2. BZOJ 2318: Spoj4060 game with probability Problem (概率dp)(博弈论)

    2318: Spoj4060 game with probability Problem Description Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬币,如果 ...

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

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

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

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

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

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

  6. Bzoj 2318 Spoj4060 game with probability Problem

    2318: Spoj4060 game with probability Problem Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 524  Sol ...

  7. 2318: Spoj4060 game with probability Problem

    2318: Spoj4060 game with probability Problem Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 356  Sol ...

  8. BZOJ2318: Spoj4060 game with probability Problem

    #include<iostream> #include<algorithm> #include<cstring> #include<cstdio> #i ...

  9. 【bzoj2318】Spoj4060 game with probability Problem

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

随机推荐

  1. sklearn_PCA主成分降维

    # coding:utf-8 import pandas as pd import numpy as np from pandas import Series,DataFramefrom sklear ...

  2. Linux Shell管道调用用户定义函数(使shell支持map函数式特性)

    Linux中有一个管道的概念,常用来流式的处理文本内容,比如一个文件对其中的每一行应用好几个操作,出于两个方面的考虑可能需要在管道中使用用户定义函数: 1. 刚需: 内置的sed/awk之类的可能没法 ...

  3. C++的各种初始化方式

    C++小实验测试:下面程序中main函数里a.a和b.b的输出值是多少? #include <iostream> struct foo { foo() = default; int a; ...

  4. 使用MongoDB命令工具导出、导入数据

    Windows 10家庭中文版,MongoDB 3.6.3, 前言 在前面的测试中,已经往MongoDB的数据库中写入了一些数据.现在要重新测试程序,数据库中的旧数据需要被清理掉,可是,又想保存之前写 ...

  5. Codeforces 429B Working out(递推DP)

    题目链接:http://codeforces.com/problemset/problem/429/B 题目大意:两个人(假设为A,B),打算健身,有N行M列个房间,每个房间能消耗Map[i][j]的 ...

  6. SQL Server 2000中查询表名,列名及字段类型

    经常碰到一些忘记表名称的情况,此时只记得个大概,此时可通过查询系统表Sysobjects找到所要的表名,如要查找包含用户的表名,可通过以下SQL语句实现, Select * From sysobjec ...

  7. IdentityServer4揭秘---登录

    IdentityServer4默认提供了的登录地址是Account/Index 同意页面是Consent/Index 这里我们可以通过IdentittyServer4的用户交互自定义配置设置 在Con ...

  8. HBase(一)HBase入门简介

    一 HBase 的起源 HBase 的原型是 Google 的 BigTable 论文,受到了该论文思想的启发,目前作为 Hadoop 的子项目来开发维护,用于支持结构化的数据存储. Apache H ...

  9. 将C++ IplImage 图像用C#读取

    如何将C++ IplImage 图像用C#读取  ? 将opencv 的C++程序做成 dll 动态链接库 用C#调用 当然这里需要安装emgucv  ,也可以自己实现这个类. 下面我把实现贴出来给大 ...

  10. 如何解决谷歌Chrome浏览器空白页的问题

    如何解决谷歌Chrome浏览器空白页的问题   谷歌Chrome浏览器突然不打开任何网页,无论是任何站点(如http://www.baidu.com), 还是Chrome浏览器的设置页面(chrome ...