• 【BZOJ2318】Spoj4060 game with probability Problem 概率


    【BZOJ2318】Spoj4060 game with probability Problem

    Description

    AliceBob在玩一个游戏。有n个石子在这里,AliceBob轮流投掷硬币,如果正面朝上,则从n个石子中取出一个石子,否则不做任何事。取到最后一颗石子的人胜利。Alice在投掷硬币时有p的概率投掷出他想投的一面,同样,Bobq的概率投掷出他相投的一面。

    现在Alice先手投掷硬币,假设他们都想赢得游戏,问你Alice胜利的概率为多少。

    Input

    第一行一个正整数t,表示数据组数。

    对于每组数据,一行三个数npq

    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

    题解:设f[i]表示轮到A投时A的胜率,g[i]表示轮到B投时A的胜率,x表示A投正面的概率,y表示B投正面的概率。

    先得出朴素方程:

    f[i]=g[i]*(1-x)+g[i-1]*x

    g[i]=f[i]*(1-y)+f[i-1]*y

    解方程,得

    f[i]=(x*g[i-1]+(1-x)*y*f[i-1])/(1-(1-x)*(1-y));
    g[i]=(y*f[i-1]+(1-y)*x*g[i-1])/(1-(1-x)*(1-y));

    然后容易看出,当f[i-1]<g[i-1]时,x=p,y=q最优,当f[i-1]>g[i-1]时,x=1-p,y=1-q最优

    然而n太大了怎么办?我们有黑科技!

    当n足够大时f[n]和g[n]一定会稳定在某个值附近,于是我们令n=min(n,1000)就好了

    #include <cstdio>
    #include <iostream>
    using namespace std;
    int n;
    double f[1010],g[1010],p,q,x,y;
    int main()
    {
        int t,n,i;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%lf%lf",&n,&p,&q);
            n=min(n,1000);
            f[0]=0,g[0]=1;
            for(i=1;i<=n;i++)
            {
                if(f[i-1]>g[i-1])    x=1-p,y=1-q;
                else    x=p,y=q;
                f[i]=(x*g[i-1]+(1-x)*y*f[i-1])/(1-(1-x)*(1-y));
                g[i]=(y*f[i-1]+(1-y)*x*g[i-1])/(1-(1-x)*(1-y));
            }
            printf("%.6f
    ",f[n]);
        }
        return 0;
    }
  • 相关阅读:
    洛谷P1422 小玉家的电费
    洛谷P1425 小鱼的游泳时间
    洛谷P1421 小玉买文具
    洛谷P1001 A+B Problem
    洛谷P1000 超级玛丽游戏
    Android Hook框架adbi的分析(2)--- inline Hook的实现
    Android Apk加固的初步实现思路(dex整体加固)
    Android Hook框架adbi的分析(1)---注入工具hijack
    从苏宁电器到卡巴斯基(后传)第05篇:聊聊我对WannaCry产生的感慨
    Android APK程序的smali动态调试
  • 原文地址:https://www.cnblogs.com/CQzhangyu/p/6208699.html
Copyright © 2020-2023  润新知