科大讯飞笔试总结
时间: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时其实没有必要剪,只是题目的要求是至少要剪一刀。

浙公网安备 33010602011771号