• I


    Problem Statement

    Let NN be a positive odd number.

    There are NN coins, numbered 1,2,,N1,2,…,N. For each ii (1iN1≤i≤N), when Coin ii is tossed, it comes up heads with probability pipi and tails with probability 1pi1−pi.

    Taro has tossed all the NN coins. Find the probability of having more heads than tails.

    Constraints

    • NN is an odd number.
    • 1N29991≤N≤2999
    • pipi is a real number and has two decimal places.
    • 0<pi<10<pi<1

    Input

    Input is given from Standard Input in the following format:

    NN
    p1p1 p2p2  pNpN
    

    Output

    Print the probability of having more heads than tails. The output is considered correct when the absolute error is not greater than 10910−9.


    Sample Input 1 Copy

    Copy
    3
    0.30 0.60 0.80
    

    Sample Output 1 Copy

    Copy
    0.612
    

    The probability of each case where we have more heads than tails is as follows:

    • The probability of having (Coin1,Coin2,Coin3)=(Head,Head,Head)(Coin1,Coin2,Coin3)=(Head,Head,Head) is 0.3×0.6×0.8=0.1440.3×0.6×0.8=0.144;
    • The probability of having (Coin1,Coin2,Coin3)=(Tail,Head,Head)(Coin1,Coin2,Coin3)=(Tail,Head,Head) is 0.7×0.6×0.8=0.3360.7×0.6×0.8=0.336;
    • The probability of having (Coin1,Coin2,Coin3)=(Head,Tail,Head)(Coin1,Coin2,Coin3)=(Head,Tail,Head) is 0.3×0.4×0.8=0.0960.3×0.4×0.8=0.096;
    • The probability of having (Coin1,Coin2,Coin3)=(Head,Head,Tail)(Coin1,Coin2,Coin3)=(Head,Head,Tail) is 0.3×0.6×0.2=0.0360.3×0.6×0.2=0.036.

    Thus, the probability of having more heads than tails is 0.144+0.336+0.096+0.036=0.6120.144+0.336+0.096+0.036=0.612.


    Sample Input 2 Copy

    Copy
    1
    0.50
    

    Sample Output 2 Copy

    Copy
    0.5
    

    Outputs such as 0.5000.500000001 and 0.499999999 are also considered correct.


    Sample Input 3 Copy

    Copy
    5
    0.42 0.01 0.42 0.99 0.42
    

    Sample Output 3 Copy

    Copy
    0.3821815872
    
    #include <iostream>
    #include <vector>
    #include <algorithm>
    #include <string>
    #include <set>
    #include <queue>
    #include <map>
    #include <sstream>
    #include <cstdio>
    #include <cstring>
    #include <numeric>
    #include <cmath>
    #include <iomanip>
    #include <deque>
    #include <bitset>
    //#include <unordered_set>
    //#include <unordered_map>
    #define ll              long long
    #define pii             pair<int, int>
    #define rep(i,a,b)      for(int  i=a;i<=b;i++)
    #define dec(i,a,b)      for(int  i=a;i>=b;i--)
    using namespace std;
    int dir[4][2] = { { 1,0 },{ 0,1 } ,{ 0,-1 },{ -1,0 } };
    const long long INF = 0x7f7f7f7f7f7f7f7f;
    const int inf = 0x3f3f3f3f;
    const double pi = 3.14159265358979323846;
    const double eps = 1e-6;
    const int mod = 1e9 + 7;
    const int N = 3e3 + 5;
    //if(x<0 || x>=r || y<0 || y>=c)
    
    inline ll read()
    {
        ll x = 0; bool f = true; char c = getchar();
        while (c < '0' || c > '9') { if (c == '-') f = false; c = getchar(); }
        while (c >= '0' && c <= '9') x = (x << 1) + (x << 3) + (c ^ 48), c = getchar();
        return f ? x : -x;
    }
    ll gcd(ll m, ll n)
    {
        return n == 0 ? m : gcd(n, m % n);
    }
    ll lcm(ll m, ll n)
    {
        return m * n / gcd(m, n);
    }
    bool prime(int x) {
        if (x < 2) return false;
        for (int i = 2; i * i <= x; ++i) {
            if (x % i == 0) return false;
        }
        return true;
    }
    ll qpow(ll m, ll k, ll mod)
    {
        ll res = 1, t = m;
        while (k)
        {
            if (k & 1)
                res = res * t % mod;
            t = t * t % mod;
            k >>= 1;
        }
        return res;
    }
    double dp[N][N];
    double a[N],ans;
    int main()
    {
        ll n;
        cin >> n;
        rep(i, 1, n)
            cin >> a[i];
        dp[0][0] = 1;
        rep(i, 1, n)
        {
            rep(j, 0, i)
            {
                int x = j, y = i - j;
                if (x)
                    dp[x][y] += dp[x - 1][y] * a[i];
                if (y)
                    dp[x][y] += dp[x][y - 1] * (1 - a[i]);
            }
        }
        int l = n, r = 0;
        while (l > r)
        {
            ans += dp[l][r];
            l--, r++;
        }
        printf("%.10f
    ", ans);
        return 0;
    }
  • 相关阅读:
    [CF528D] Fuzzy Search
    [WC2013] 糖果公园
    [APIO2011] 方格染色
    [CTSC2017] 吉夫特
    [HNOI/AHOI2018] 转盘
    [CTSC2008] 网络管理
    [HAOI2018] 苹果树
    [SCOI2016] 萌萌哒
    git创建分支并提交项目
    git 常规操作
  • 原文地址:https://www.cnblogs.com/dealer/p/13175639.html
Copyright © 2020-2023  润新知