UVa 11346 Probability (转化+积分+概率)
Posted dwtfukgv
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UVa 11346 Probability (转化+积分+概率)相关的知识,希望对你有一定的参考价值。
题意:给定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; }
以上是关于UVa 11346 Probability (转化+积分+概率)的主要内容,如果未能解决你的问题,请参考以下文章
UVA 11346 Probability (几何概型, 积分)
UVA11181 Probability|Given概率+DFS
UVA11181Probability|Given(条件概率)