概率&数学期望训练题集

讲解视频

1.Headshot UVA - 1636:

分析:
分类讨论,比较两种情况下没有子弹射出的概率大小;
(1).如果直接射击,要使得没有子弹射出,且在第一次没有子弹射出的条件下,即求 \(00\) 串数量占 \(00\)\(01\) 总数量的比例(条件概率);
(2).如果要转一下再射击并保证没有子弹,即求串中 \(0\) 的数量占整个串长度的比例;
代码:

#include <bits/stdc++.h>
using namespace std;
char ss[110];
int main()
{
    while(scanf("%s",ss+1)!=EOF)
    {
        int n=strlen(ss+1);
        int a=0,b=0,c=0;
        for(int i=1;i<=n;i++)
            c+=(ss[i]=='0'?1:0);
        for(int i=2;i<=n;i++)
        {
            if(ss[i]=='0'&&ss[i-1]=='0')
                b++;
            else if(ss[i]=='1'&&ss[i-1]=='0')
                a++;
        }
        if(ss[n]=='0'&&ss[1]=='0')
            b++;
        else if(ss[n]=='0'&&ss[1]=='1')
            a++;
        int x=c*(a+b),y=n*b;
        if(y>x)
            printf("SHOOT\n");
        else if(y<x)
            printf("ROTATE\n");
        else
            printf("EQUAL\n");
    }
    return 0;
}

2.Cows and Cars UVA - 10491:

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int a,b,c;
    while(scanf("%d%d%d",&a,&b,&c)!=EOF)
    {
        double ans=(1.0*b*(b-1)+1.0*a*b)/(1.0*(a+b)*(a+b-c-1));
        printf("%.5f\n",ans);
    }
    return 0;
}

3.Probability|Given UVA - 11181:

分析:
由题意可知,该题为一道条件概率。
条件概率公式:

\[P(A_i|B)=\frac{P(A_i*B)}{P(B)} \]

其中,\(P(B)\)\(n\) 个人中恰好有 \(r\) 个人购买商品的概率,\(P(A_i*B)\) 表示 \(n\) 个人中恰好有 \(r\) 个人购买商品且第 \(i\) 个人一定购买的概率。
采用子集枚举的方法,枚举情况求出各个概率。
输入以 \(n=0\) 结束。
代码:

#include <bits/stdc++.h>
using namespace std;
double p[25],ans[25],sum;
void solve(int n,int r)
{
    sum=0;
    for(int i=0;i<n;i++)
        ans[i]=0;
    for(int i=0;i<(1<<n);i++)
    {
        int t=i,cnt=0;
        while(t)
        {
            if(t&1)
                cnt++;
            t>>=1;
        }
        if(cnt!=r)
            continue;
        double tmp=1.0;
        for(int j=0;j<n;j++)
            tmp=tmp*(((i>>j)&1)?p[j]:1-p[j]);//cout<<"tmp"<<tmp<<endl;
        sum+=tmp;
        for(int j=0;j<n;j++)
            ans[j]+=(((i>>j)&1)?tmp:0);
    }
}
int main()
{
    int n,r,cot=0;
    while(scanf("%d%d",&n,&r),n)
    {
        for(int i=0;i<n;i++)
            scanf("%lf",&p[i]);
        solve(n,r);
        printf("Case %d:\n",++cot);
        for(int i=0;i<n;i++)
            printf("%.6f\n",ans[i]/sum);
    }
    return 0;
}
/*
3 2
0.10
0.20
0.30
5 1
0.10
0.10
0.10
0.10
0.10
*/

猜你喜欢

转载自www.cnblogs.com/1024-xzx/p/12602139.html
今日推荐