题意:给定a,b,s,在[-a, a]*[-b, b]区域内任取一点p,求以原点(0,0)和p为对角线的长方形面积大于s的概率。
析:应该明白,这个和高中数学的东西差不多,基本就是一个求概率的题,只不过更简单了,不用你算了,你给出表达式,
让计算机帮你算即可。
由对称性知道,只要求[a, b]区域内的概率就OK了,也就是xy > s,由高中的知识也知道应该先求xy = s的曲线,
然后求在曲线上面的面积,这就用到了积分,由于上面的不好求,我们先求下面的,再用总面积减掉即可(自己画个图看看),
挺简单的,原函数也特别好求(比高数课本上的舒服多了),然后后面就简单了,不用说了吧。。。
注意的是,这个题a,b,s都是实数,我以为是整数,WA好几次,还有要注意如果s > ab,概率要为0,要特殊考虑,
最后注意点误差(虽然我没管也AC了),如果s太小了,可直接返回1,因为基本忽略不记,是特别小的时候。
代码如下:
#include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #include <cmath> using namespace std; const int maxn = 400000 + 10; int main(){ int T; cin >> T; double a, b, s; while(T--){ scanf("%lf %lf %lf", &a, &b, &s); if(0 == s){ printf("100.000000%%\n"); continue; } else if(s > a*b){ printf("0.000000%%\n"); continue; } double ans = s + s * log(a*b/s); if(ans <= 0) printf("0.000000%%\n"); else printf("%.6lf%%\n", 100.0 - ans*100.0 / (a*b)); } return 0; }