kuangbin专题二十一概率&期望总结

做的时候觉得很难,很多题都是看题解做的,所以放了一段时间。这几天把kuangbin聚聚博客上的3篇论文仔细看了看,再看这些题就感觉思路很显然了。但仍然有几题不能想出来,故这里补一下总结,这也算kuangbin专题的最后一篇博客了。
首先将这几篇论文贴上来,论文真的真的很难懂。。认真看看但不要太深入即可。(高中生太强了。。
《信息学竞赛中概率问题求解初探》
《浅析竞赛中一类数学期望问题的解决方法》
《有关概率和期望问题的研究》

J - Lights inside 3D Grid
这题做的时候并没有思路,看题解后才明白,期望有的时候会算每个点的贡献,而并非要一起算,这题我们可以先求出每个点被包围的概率,再用等比数列求和算出被包围奇数次的概率,再将每个点的概率相加即可。

#include<bits/stdc++.h>
using namespace std;
double Cal(int a,int b)
{
    return 1.0-(0.0+(a-1)*(a-1)+(b-a)*(b-a))/(0.0+b*b);
}
int main()
{
    int T;
    scanf("%d",&T);
    int cas=1;
    while(T--)
    {
        int X,Y,Z,K;
        scanf("%d %d %d %d",&X,&Y,&Z,&K);
        double ans=0;
        for(int i=1;i<=X;i++)
            for(int j=1;j<=Y;j++)
                for(int k=1;k<=Z;k++)
                {
                    double p=Cal(i,X)*Cal(j,Y)*Cal(k,Z);
                    //cout<<p<<endl;
                    ans+=(0.5-0.5*pow(1.0-2*p,1.0*K));
                }
        printf("Case %d: %.6f\n",cas++,ans);
    }
    return 0;


}

N - Aladdin and the Magical Sticks
这题有点数学知识在里面。
根据期望的线性性,E(CX)=CE(X)
所以可以对每根棍子求一下它被抽到的期望次数,再乘以它的权值。
对于不可识别的棍子,由于他被抽到的概率满足几何分布
所以可以转化成一类经典模型,叫做邮票收集问题(稍后会开另一篇博客详细介绍这个)。
对于那些可以识别的棍子,它们的贡献实际上就只有1次,那么将其重量加起来即可。
对于那些不可识别的棍子,它们被抽的期望次数是 H ( n ) , H ( n ) 是调和级数的第n项。

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int T;
    scanf("%d",&T);
    int cas=1;
    while(T--)
    {
        int n;
        scanf("%d",&n);
        double f=0;
        for(int i=1;i<=n;i++)
            f+=1.0/i;
        int a,b;
        double ans=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d %d",&a,&b);
            if(b==1)
                ans+=a;
            else
                ans+=1.0*a*f;
        }
        printf("Case %d: %.6f\n",cas++,ans);
    }
    return 0;

}

P - A Dangerous Maze (II)
这题和A类似,但有了一个记忆的功能。
dp[i]设已经记了i个门的期望。
设num1为能出去的门的个数,num2为折返的门的个数,tmp1为出去的平均时间,tmp2为折返的平均时间。
那么i=k时,dp[i]=num1*tmp1/(n-i)+(dp[i]+tmp2)*(num2-i)/(n-i).
当i < k时,dp[i]=num1/(n-i)tmp1+(num2-i)/(n-i)(dp[i+1]+tmp2).

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int T;
    scanf("%d",&T);
    int cas=1;
    while(T--)
    {
        int n,k;
        scanf("%d %d",&n,&k);
        int tmp,sum1=0,sum2=0,num1=0,num2=0;
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&tmp);
            if(tmp>0)
            {
                num1++;
                sum1+=tmp;
            }
            else
            {
                num2++;
                sum2+=abs(tmp);
            }
        }
        printf("Case %d: ",cas++);
        if(sum1==0)
            puts("-1");
        else
        {
            double tmp1=0;
            if(num1)tmp1=1.0*sum1/num1;
            double tmp2=0;
            if(num2)tmp2=1.0*sum2/num2;
            k=min(k,num2);
            double dp=(num1*tmp1+(num2-k)*tmp2)/(n-num2);
            for(int i=k-1;i>=0;i--)
            {
                dp=num1*tmp1/(n-i)+(dp+tmp2)*(num2-i)/(n-i);
                //cout<<dp<<endl;
            }
            printf("%.10f\n",dp);
        }
    }
    return 0;


}

Q - Batting Practice
这个傻逼题,浪费我好长时间,原因是递推公式化简化错了。。
设g[i]为已经投中了i颗,还需要投进m-i颗球的期望,设f[i]为投丢i颗,还需要再投丢n-i颗球的期望,那么可得公式
g[i] = (1-p) * (g[i+1] + 1) + p * (f[1] + 1),即
g[i] = (1-p) * g[i+1] + f[1] + 1
g[1]可化简为 g [ 1 ] = ( ( 1 p ) k 1 2 + ( 1 p ) k 1 3 + . . . + ( 1 p ) 0 ) ( f [ 1 ] + 1 )
同理f[1]也可化简为这个式子。

#include<bits/stdc++.h>
using namespace std;
const double eps=1e-9;
int main()
{
    int T;
    scanf("%d",&T);
    int cas=1;
    while(T--)
    {
        double p;
        int m,n;
        scanf("%lf %d %d",&p,&m,&n);
         if(p < eps) {         
            printf("Case %d: %d\n", cas++, m);
            continue;
        }
        if(1.0 - p < eps) {
            printf("Case %d: %d\n", cas++, n);
            continue;
        }   
        double q=1-p;
        double tp=1-pow(p,n-1),tq=1-pow(q,m-1);
        double tmp=1-tp*tq;
        double ans1=(tp*tq/p+tp/q)/tmp;
        double ans2=tq*ans1+tq/p;
        printf("Case %d: %lf\n",cas++,ans1*p+ans2*q+1);
    }
    return 0;

}

记住那个特判,当p很小的时候可能丢失精度,那么就直接输出答案。
匆匆忙忙把这篇博客写完了,这一段学习终于可以说告一段落了。接下来还得努力啊。

猜你喜欢

转载自blog.csdn.net/qq_34921856/article/details/80504300