本文为该书的笔记:刘汝佳. 算法竞赛入门经典.第 2 版 [M]. 清华大学出版社, 2014.
UVa11346 概率
在 [-a,a]*[-b,b] 区域内随机取一个点 P ,求以 (0,0)和 P 为对角线的长方形面积大于 S 的概率( a,b>0 , S ≥ 0 )。例如 a=10 , b=5 , S=20 ,答案为 23.35 %。
样例:
Sample Input
3
10 5 20
1 1 1
2 2 0
Sample Output
23.348371%
0.000000%
100.000000%
根据对称性,我们可以只考虑第一象限的情况,在第一象限内以 (0,0)和 P(x,y)为对角线的长方形面积等于 S 的点所组成的曲线为 y = S x y=\frac S x y=xS ,在该曲线上方的点都满足条件。而求正方形内曲线上方的点的面积,我们可以用正方形面积减去阴影部分的面积。
P 点的坐标为 (S/b,b),故阴影部分面积为:
S b × b + ∫ S b a S x = S + S ∫ S b a 1 x \frac S b \times b+\int _{\frac S b} ^a {\frac S x}=S+S\int _{\frac S b} ^a {\frac 1 x} bS×b+∫bSaxS=S+S∫bSax1
∫ S b a 1 x = l n ( a ) − l n ( S b ) = l n ( a b S ) \int _{\frac S b} ^a {\frac 1 x}=ln(a)-ln(\frac S b)=ln(\frac {ab} S) ∫bSax1=ln(a)−ln(bS)=ln(Sab)
如果设 m = a b m=ab m=ab ,则概率为 m − S − S l n ( m S ) m \frac {m-S-Sln(\frac m S)} m mm−S−Sln(Sm) 。
但是这个式子是有范围的,如果 m<=S,概率为 1 。当 S 很接近 0 的时候, m S \frac m S Sm 就有可能溢出,或者计算无意义。
完整程序:
//#define LOCAL
#include <iostream>