• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
dwtfukgv
博客园    首页    新随笔    联系   管理    订阅  订阅
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;
}

 

posted on 2016-05-29 13:10  dwtfukgv  阅读(306)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3