科大讯飞笔试总结

时间:2019-08-16

时长:100分钟

题型:C++:

单选题45题 40min
填空题4题 15min
编程题2题 45min

 

 

 

 

 


填空题

标准正态分布中 $\mu$ 和 $\sigma$ 的置信区间的求解

求解置信区间的步骤:

(1)寻找一个样本的函数 $g(X_1,X_2,...,X_n,\theta)$ ----称为枢轴量,它含有待估参数,不含其他未知参数,他的分布已知,且分布不依赖于待估参数(常由 $\theta$ 的点估计出发考虑)

如:$\bar{X} \sim N(\mu,1/5)$,取枢轴量 $g(X_1,X_2,...,X_n,\mu) = \frac{\bar{X} - \mu}{\sqrt{1/5}} \sim N(0,1)$

(2)给定置信度 $1-\alpha$,定出常数 $a,b$,使得   $P(a<g(X_1,X_2,...,X_n,\theta)<b)=1-\alpha $

如:$a = -1.96,b=1.96$

(3)由 $a<g(X_1,X_2,...,X_n,\theta)<b$ 解出 $T_1,T_2$,得到置信区间 $(T_1,T_2)$

如: $(T_1,T_2) = (\bar{X} -1.96 \sqrt{1/5},\bar{X} +1.96 \sqrt{1/5})$

置信区间的常用公式:(一个正态总体 $X~N(\mu,\sigma ^2)$ 的情形)

         1)方差 $\sigma ^2$ 已知,$\mu$ 的置信区间

         由$\bar{X} \sim N(\mu,\frac{\sigma ^2}{n})$ 选取枢轴量

                             $g(X_1,X_2,...,X_n,\mu) = \frac{\bar{X} - \mu}{\sigma / \sqrt{n}} \sim N(0,1)$

         由 $P\left( \left|\frac{\bar{X} - \mu}{\sigma / \sqrt{n}} \right| \geq z_{\frac{\alpha}{2}}\right) = \alpha$ 确定 $ z_{\frac{\alpha}{2}}$, 解:

         $\left|\frac{\bar{X} - \mu}{\sigma / \sqrt{n}} \right| < z_{\frac{\alpha}{2}}$

         得 $\mu$ 的置信度为 $1-\alpha$ 的置信区间为:$\left ( \bar{X}-z_{\frac{\alpha }{2}} \frac{\sigma _0}{\sqrt{n}},\bar{X}+z_{\frac{\alpha }{2}} \frac{\sigma _0}{\sqrt{n}}\right )$

         2)方差 $\sigma ^2$ 未知,$\mu$ 的置信区间

         选取枢轴量 $T = \frac{\bar{X} - \mu}{ S / \sqrt{n}} \sim T(n-1)$

         由 $P\left( \left|\frac{\bar{X} - \mu}{S / \sqrt{n}} \right| \geq t_{\frac{\alpha}{2}}(n-1)\right) = \alpha$ 确定  $t_{\frac{\alpha}{2}}(n-1)$

         故 $\mu$ 的置信区间为 $\left ( \bar{X}-t_{\frac{\alpha } {2} }(n-1) \frac{S}{\sqrt{n}},      \bar{X}+t_{\frac{\alpha }{2} } (n-1) \frac{S}{\sqrt{n}}  \right )$

编程题

动态规划:剪绳子问题 长为 m 的一段绳子,将其剪成K段,每段长为k[1],k[2],...,k[K],则每段的长度的乘积为 L= k[1]*k[2]*...*k[K],找到一种裁剪方案,使得 L 取得最大值。

解析:

(1)动态规划

假设将一根绳子从 i 处进行裁剪,则此时的长度 L = dp[i]*dp[m-i]

其中dp[i] 表示一段长为 i 的绳子能够裁剪出的最大的乘积,由于 i 的取值可以是任意的,因此,对于一段长为 m 的绳子,最优的解决方案为:

     dp[m] = max({dp[i] * dp[m-i]  | i = 1,2,...,m/2 }

上式便是动态规划的子结构,为了方便计算,一般采用自底向上的方法,即从最小的 i 开始计算出dp[i], 最终得到 dp[m]

则程序代码如下:

int dpCut(int &m)
{
    if(m<2)
        return 0;
    if (m==2)
        return 1;
    if (m==3)
        return 2;
    vector<int> arr(m+1);
    arr[0] = 0;
    arr[1] = 1;
    arr[2] = 2;
    arr[3] = 3;
    int maxL = 0;
    for (int i = 4;i<=m;++i)
    {
        maxL = 0;
        for(int j = 1;j<=i/2;++j)
        {
            int temp = arr[j]*arr[i-j];
            if(maxL<temp)
                maxL = temp;
            arr[i] = maxL;
        }
    }
    return arr[m];
}

(2)数学公式推理法(假设至少切一刀);

将其切成3和2 的组合,并且当m>5时,尽可能的切 3.

代码如下:

int max(int length)
{
    if (length < 2)
    {
        return 0;
    }
    if (length == 2)
    {
        return 1;
    }
    if (length == 3)
    {
        return 2;
    }
    //尽可能多地剪去长度为3的绳子
    int temp = length / 3;
    //当绳子最后剩下长度为4的时候,不能再剪去长度为3的绳子段
    //此时更好的方法是把绳子剪成长度为2的两段,因此2x2>3x1
    if (length - temp * 3 == 1)
    {
        temp -= 1;
    }
    //有三种情况,最后是0,1,2,3,4(0,1,3时temp=0,pow(2,0)=1)(2,4时pow分别为2和4)
    int temp2 = (length - temp * 3) / 2;
    return (int)(pow(3, temp))*(int)(pow(2, temp2));
}

接下来我们证明这种思路的正确性。首先,当m>=5的时候,我们可以证明2(m-2)>n并且3(m-3)>n。也就是说,当绳子剩下的长度大于或者等于5的时候,我们就把它剪成长度为3或者2的绳子段。另外,当m>=5时,3(m-3)>=2(m-2),因此我们应该尽可能地多剪长度为3的绳子段。

  前面证明的前提是m>=5。那么当绳子的长度为4呢?在长度为4的绳子上剪一刀,有两种可能的结果:剪成长度为1和3的两根绳子,或者两根长度都为2的绳子。注意到2x2>1x3,同时2x2=4也就是说,当绳子长度为4时其实没有必要剪,只是题目的要求是至少要剪一刀。

 

posted @ 2019-08-16 22:38  Z_W  阅读(525)  评论(0)    收藏  举报