非常令人自闭的一套题,5个小时只过了这一道题,而且借助了外部工具算积分,不然高数太菜根本不会。
题目大意:给定一个n条边(n<=1000)的简单多边形,再给定一个起点坐标。从起点随机一个方向做一条射线,问射线与多边形交的长度的期望值。坐标范围绝对值<=1e6,输出绝对误差不超过1e-6。
首先写出表达式
\[ \mathbb{E}(x) = \frac{1}{2\pi} \int_0^{2\pi}{f(\theta) \mathrm{d}\theta} \]
其中f(θ)是相交长度。然后算这个表达式感觉上数值积分并不靠谱,因为很容易构造出极不光滑的的例子来卡。比如如果直接上自适应Simpson积分,只要f(θ)在一小段上变化剧烈就算不出来。
这么想想还是手算解这个积分。首先因为期望(积分)的线性性可以把多边形拆成每一段的贡献分别算。为了计算方便,把起点变换到原点,线段的一个端点变换到x轴上。
现要用角BAD表示相交长度f。则
\[f=sin B \cdot \frac{c}{sinADB}= sin B \cdot \frac{c}{sin(\pi- B- BAD)}\]
然后答案就是
\[ \mathbb{E}(x) = \frac{c\cdot sinB}{2\pi} \int_{0}^{A}{csc(\theta) \mathrm d \theta} \]
\[\int csc(\theta) \mathrm d \theta=ln(csc(\theta)-cot(\theta)) + C\]
代进去算就好了。
注意直接这样算有数值稳定性问题,一个a、b边特别长的三角形会GG,误差达到1e-3。所以这时候判断一下,换另一个角算即可。
这题应该算最简单的题,但只过了6个队,估计跟我一样卡在算积分上了(高数还要好好学)。另外可见中学生学高数水平比大学生强。