题解-概率计算器

Problem

求给定式子的期望:题面

Solution

由于式子是由\(\max ,\min\)组成的,而这东西是基于比较大小的,所以我们需要想想在基于比较的情况下方便实现的东西

设\(f(x)\)表示式子小于等于\(x\)的概率,\(g(x)\)表示式子大于等于\(x\)的概率



则对于单个变量,易证有:

\(f(x)=x\\g(x)=1-f(x)\)

对于式子\(\max(x_1,x_2)\)

\[f(x)=f_1(x)\cdot f_2(x)\]

\[g(x)=1-f_1(x)\cdot f_2(x)\]

对于式子\(\min(x_1,x_2)\)

\[g(x)=g_1(x)\cdot g_2(x)\]

\[f(x)=1-g_1(x)\cdot g_2(x)\]



接下来考虑如何统计答案

众所周知,答案可以表达为

\[\int_0^1p(ans=x)\cdot x\cdot dx\]

由于\(f(x)\)表示的是式子小于等于\(x\)的概率

即\(f(x)=p(ans\leq x)\),则有\(f‘(x)=p(ans=x)\)

即最终答案为

\[\int_0^1f‘(x)\cdot x\cdot dx\]

\(f(x)\)可以由递归求解

至于原式的话,只要简单求导积分即可



注意:如果在oj上下了数据,并且在第六位小数处出现1的误差,是因为oj上下载数据的链接有问题?提交即可AC

Code

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
#define rg register

template <typename _Tp> inline _Tp read(_Tp&x){
    char c11=getchar(),ob=0;x=0;
    while(c11^‘-‘&&!isdigit(c11))c11=getchar();if(c11==‘-‘)ob=1,c11=getchar();
    while(isdigit(c11))x=x*10+c11-‘0‘,c11=getchar();if(ob)x=-x;return x;
}

const int N=100;
int l[N],r[N],m[N];
int ps[10101],st[N];
char s[10101];
int n,len;

struct poly{
    ll a[N];int d;
    inline poly(){memset(a,0,sizeof(a)),d=0;}
    friend inline poly operator * (poly A,poly B){
        poly res;res.d=A.d+B.d-1;
        for(rg int i=0;i<A.d;++i)
        for(rg int j=0;j<B.d;++j)
            res.a[i+j]+=A.a[i]*B.a[j];
        return res;
    }
    friend inline poly operator - (poly A,poly B){
        poly res;res.d=max(A.d,B.d);
        for(rg int i=0;i<res.d;++i)
            res.a[i]=A.a[i]-B.a[i];
        return res;
    }
    inline void deri(){
        for(rg int i=0;i<d-1;++i)
            a[i]=a[i+1]*(i+1);
        a[--d]=0;
    }
}ans,vec;

poly calc(int opt,int L,int R){
    if(s[L+1]==‘x‘){
        poly res;res.d=2;
        if(!opt)res.a[1]=1;
        else res.a[1]=-1,res.a[0]=1;
        return res;
    }
    for(int i=L+1;i<=R;++i)if(ps[i]){
        int id=ps[i];
        if(!opt)
            if(s[i-1]==‘x‘)return calc(opt,l[id],m[id])*calc(opt,m[id]+1,r[id]);
            else return vec-(calc(opt^1,l[id],m[id])*calc(opt^1,m[id]+1,r[id]));
        else
            if(s[i-1]==‘n‘)return calc(opt,l[id],m[id])*calc(opt,m[id]+1,r[id]);
            else return vec-(calc(opt^1,l[id],m[id])*calc(opt^1,m[id]+1,r[id]));
    }
}

void init();
int main(){
    vec.d=2;vec.a[0]=1;
    while(~scanf("%s",s)){
        init();
        ans=calc(0,-1,len-1);
        ans.deri();
        for(rg int i=ans.d;i;--i)
            ans.a[i]=ans.a[i-1];
        ans.a[0]=0;++ans.d;
        double res=0;
        for(rg int i=ans.d;i;--i)
            res+=1.0*(ans.a[i-1]%i)/i;
        while(res<=0)++res;while(res>=1)--res;
        printf("%.6lf\n",res);
    }return 0;
}

void init(){
    scanf("%s",s);getchar();
    cin.getline(s,10000);
    len=strlen(s);
    memset(ps,0,sizeof(ps));
    int idc=0,tp=0;
    for(int i=0;i<len;++i){
        if(s[i]==‘(‘)ps[l[st[++tp]=++idc]=i]=idc;
        else if(s[i]==‘,‘)m[st[tp]]=i;
        else if(s[i]==‘)‘)r[st[tp--]]=i;
    }
}

原文地址:https://www.cnblogs.com/penth/p/9675816.html

时间: 2024-11-02 21:20:33

题解-概率计算器的相关文章

《天天德州》之德州牛仔概率计算器

鹅厂的<天天德州>里有个相关的"小"游戏,名曰<牛仔>或<德州牛仔>.尽管其在游戏主界面上的入口并不很显眼,但它的设计却非常有创意,借德扑的规则行"涉赌"之擦边球玩法,简单来说,在假定系统公平的前提下,其完全就是靠统计.概率来获利的游戏. 综合考量其赔付设定及鹅厂的运营能量,即便其确实完全公平无猫腻(很明显这不可能),在收入等硬指标上恐怕也相当可观! 而我则对其系统赔付比比较感兴趣,在用排列组合方式计算出了"任一人手牌&

URAL 1936 Roshambo 题解

http://acm.timus.ru/problem.aspx?space=1&num=1936 F - Roshambo Time Limit:1000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Submit Status Practice URAL 1936 Description Bootstrap: Wondering how it's played? Will: It's a game of deception.

Hello 2019 D 素因子贡献法计算期望 + 概率dp + 滚动数组

https://codeforces.com/contest/1097/problem/D 题意 给你一个n和k,问n经过k次操作之后留下的n的期望,每次操作n随机变成一个n的因数 题解 概率dp计算出每个素因子留下的概率,乘以这个素因子的值就是这个素因子的贡献期望 定义\(dp[i][j]\)为第i次操作后剩下j个素因子的概率,概率dp顺着推 \(dp[i][j]->dp[i+1][k](k<=j)\) \(dp[i+1][k]+=dp[i][j]\frac{1}{j+1}(k<=j)

2017 ICPC Asia Urumqi A.coins (概率DP + 期望)

题目链接:Coins Description Alice and Bob are playing a simple game. They line up a row of nn identical coins, all with the heads facing down onto the table and the tails upward. For exactly mm times they select any kk of the coins and toss them into the

Codeforces Round #105 (Div. 2) ABCDE

A. Insomnia cure 题解: 水,暴力一下就行了 代码: #include<bits/stdc++.h> using namespace std; #define pb push_back #define mp make_pair #define se second #define fs first #define ll long long #define CLR(x) memset(x,0,sizeof x) #define SZ(x) ((int)(x).size()) #de

用quick制作仿PkrCruncher

将自己写的一段代码贴上来,抽取的是业务逻辑层,结构比较完整,我将太具体的东西都删除掉了.里面有tableview,帧动画,替换精灵图片,获取系统时间. local CalWinRateScene = class("CalWinRateScene", function()                             return display.newScene("CalWinRateScene")                         end)

【bzoj2318】Spoj4060 game with probability Problem

题目描述 Alice和Bob在玩一个游戏.有n个石子在这里,Alice和Bob轮流投掷硬币,如果正面朝上,则从n个石子中取出一个石子,否则不做任何事.取到最后一颗石子的人胜利.Alice在投掷硬币时有p的概率投掷出他想投的一面,同样,Bob有q的概率投掷出他相投的一面. 现在Alice先手投掷硬币,假设他们都想赢得游戏,问你Alice胜利的概率为多少. 输入 第一行一个正整数t,表示数据组数. 对于每组数据,一行三个数n,p,q. 输出 对于每组数据输出一行一个实数,表示Alice胜利的概率,保

「kuangbin带你飞」专题二十 斜率DP

layout: post title: 「kuangbin带你飞」专题二十 斜率DP author: "luowentaoaa" catalog: true tags: mathjax: true - kuangbin - 动态规划 - 斜率DP 传送门 A.HDU - 3507 Print Article 题意 就是输出序列a[n],每连续输出的费用是连续输出的数字和的平方加上常数M 让我们求这个费用的最小值. 题解 概率DP的入门题,把我搞得要死要活的. 首先dp[i]表示输出前i

【ZJOI2011】看电影

题面 https://www.luogu.org/problem/P3330 题解 概率=合法方案除以总方案. 首先总方案数是$k^n$(每个人可以抽到任意一个位置) 先假设$k$可以到$1$,也就是形成了一个环,如果这样,是一定有解的. 在$k$和$1$之间加一个座位$k+1$,如果$k+1$上坐了人,则是不合法的. 对于每一个人,我们假设他从$k+1$个环元素中随机选,总共有$(k+1)^n$种方案,在剩下的$(k+1-n)$个座位中,我们可以指定任意一个为$k+1$,这样就是$(k+1)^