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(条件概率)

UVA10056 What is the Probability概率

UVa11181 Probability|Given

UVA 11181 Probability|Given