题解 UVA11346 【概率 Probability】

这道题目真是良心啊,没有卡精度

需要知道的知识:

  • 基础的概率论
  • 简单的微积分
  • 天马行空的想象力

分3种情况讨论:

第一种情况

输入的(S)是大于(a imes b)的,那么这个概率就是0%。

第二种情况

如果输入的(S)太小了,无限接近于0的话,那么概率就无限接近100%(良心出题人,没有卡这里的精度,如果再卡卡就要弄死我了)

第三种情况

也就是一般的情况

这里需要一些基础的初中数学知识来帮我们计算这个概率。

  • 因为这个区域是用平面直角坐标系的形式来描述的,所以我们可以运用分治的思想,沿(x)轴和(y)轴,把这个矩形分成4份。
  • 然后根据这个对称性,我们容易知道,直接在([0,a]*[0,b])的矩形内取点即可,答案不用除以4
  • 然后?说过了要天马行空的想象力,那么我们来瞎搞吧qwq

具体思路:

  1. 设取出的(P)点的坐标是((x,y))
  2. 那么我们可以知道,以(OP)为对角线的长方形面积就是等于(x imes y)
  3. (xy>S)的时候,就是我们需要的。但是,不等式十分的(**),所以,我们考虑函数来解释几何:当(xy=S)时,也即(y=frac{S}{x})时,所成的函数曲线在矩形([0,a]*[0,b])以上的面积,再去除以这个矩形的总面积,就是答案了。
  4. 用定积分计算出这个矩形下面的面积,再用矩形的面积减去这个下面的面积,就是上面的面积。

所以我们要来搞搞喜闻乐见的定积分计算了

函数(y=frac{S}{x})是个反比例函数,也即双曲线函数。之前说过了,我们只讨论在第一象限内的玩意。

由于反比例函数的性质,我们容易知道,这个函数与矩阵的交点在((frac{S}{b},b)),然后这个玩意的左边那个矩形的高是(a),所以我们应该在([frac{S}{b},a])这个范围内对函数(y=frac{S}{x})进行积分.

scw曾经不知天高地厚地背过积分表,然后……就用上了啊

[ ext{下边的面积}=S+int_{frac{S}{b}}^{a}frac{S}{x}\,dx ]

推式子:

( ext{下边的面积}=S+S imes int_{frac{S}{b}}^{a}frac{1}{x}\,dx)

(;;;;;\,;;;;;;;;;;;;;\,=S+S imes (ln a-ln frac{S}{b}))
//记得这个(intfrac{1}{x}\,dx=ln x),然后套上牛顿--莱布尼兹公式

(;;;;;\,;;;;;;;;;;;;;\,=S+S imes (ln frac{ab}{S}))
//(ln)的性质

(;;;;;\,;;;;;;;;;;;;;\,=S imes (1+ln frac{ab}{S}))

(;;;;;\,;;;;;;;;;;;;;\,=S imes (1+ln frac{ab}{S}))


(Answer=frac{ ext{上面的面积}}{ ext{总面积}})

(;;;;;;;;;;;;;\,=frac{ ext{总面积-下面的面积}}{ ext{总面积}})

(;;;;;;;;;;;;;\,=frac{ab-S imes (1+ln frac{ab}{S})}{ab})

然后?没了啊,就是这个基础的积分。如果没背过积分表的人可以用自适应辛普森算法(题解区里好像有人写?菜鸡的我不会……哭卿卿)

#include <bits/stdc++.h>
using namespace std;
int n;
double a,b,s;
int main()
{
  cin>>n;
  while(n--)
  {
    cin>>a>>b>>s;
    if(s>a*b) cout<<"0.000000%"<<endl;
    else if(s<0.001) cout<<"100.000000%"<<endl;
    else
    {
      double ans=100.0*(a*b-s*(1+log(a*b/s)))/a/b;
      printf("%.6lf",ans);
      cout<<"%"<<endl;
    }
  }
  return 0;
}

很好奇为啥第一篇题解是printf的%啊,多麻烦,敲俩%,cout只要敲一个%,剩下一个去%管理员去不好吗

qwq就是这样子辣,喵喵喵(概率论真是很可爱呢)

原文地址:https://www.cnblogs.com/oierscw/p/12722177.html