题解 UVA11346 【概率 Probability】
这道题目真是良心啊,没有卡精度
需要知道的知识:
- 基础的概率论
- 简单的微积分
天马行空的想象力
分3种情况讨论:
第一种情况
输入的\(S\)是大于\(a\times b\)的,那么这个概率就是0%。
第二种情况
如果输入的\(S\)太小了,无限接近于0的话,那么概率就无限接近100%(良心出题人,没有卡这里的精度,如果再卡卡就要弄死我了)
第三种情况
也就是一般的情况
这里需要一些基础的初中数学知识来帮我们计算这个概率。
- 因为这个区域是用平面直角坐标系的形式来描述的,所以我们可以运用分治的思想,沿\(x\)轴和\(y\)轴,把这个矩形分成4份。
- 然后根据这个对称性,我们容易知道,直接在\([0,a]*[0,b]\)的矩形内取点即可,答案不用除以4
- 然后?
说过了要天马行空的想象力,那么我们来瞎搞吧qwq
具体思路:
- 设取出的\(P\)点的坐标是\((x,y)\)
- 那么我们可以知道,以\(OP\)为对角线的长方形面积就是等于\(x\times y\)
- 当\(xy>S\)的时候,就是我们需要的。但是,不等式十分的\(**\),所以,我们考虑函数来解释几何:当\(xy=S\)时,也即\(y=\frac{S}{x}\)时,所成的函数曲线在矩形\([0,a]*[0,b]\)以上的面积,再去除以这个矩形的总面积,就是答案了。
- 用定积分计算出这个矩形下面的面积,再用矩形的面积减去这个下面的面积,就是上面的面积。
所以我们要来搞搞喜闻乐见的定积分计算了
函数\(y=\frac{S}{x}\)是个反比例函数,也即双曲线函数。之前说过了,我们只讨论在第一象限内的玩意。
由于反比例函数的性质,我们容易知道,这个函数与矩阵的交点在\((\frac{S}{b},b)\),然后这个玩意的左边那个矩形的高是\(a\),所以我们应该在\([\frac{S}{b},a]\)这个范围内对函数\(y=\frac{S}{x}\)进行积分.
scw曾经不知天高地厚地背过积分表,然后……就用上了啊
推式子:
\(\text{下边的面积}=S+S\times \int_{\frac{S}{b}}^{a}\frac{1}{x}\,dx\)
\(\;\;\;\;\;\,\;\;\;\;\;\;\;\;\;\;\;\;\;\,=S+S\times (\ln a-\ln \frac{S}{b})\)
//记得这个\(\int\frac{1}{x}\,dx=\ln x\),然后套上牛顿--莱布尼兹公式
\(\;\;\;\;\;\,\;\;\;\;\;\;\;\;\;\;\;\;\;\,=S+S\times (\ln \frac{ab}{S})\)
//\(\ln\)的性质
\(\;\;\;\;\;\,\;\;\;\;\;\;\;\;\;\;\;\;\;\,=S\times (1+\ln \frac{ab}{S})\)
\(\;\;\;\;\;\,\;\;\;\;\;\;\;\;\;\;\;\;\;\,=S\times (1+\ln \frac{ab}{S})\)
\(Answer=\frac{\text{上面的面积}}{\text{总面积}}\)
\(\;\;\;\;\;\;\;\;\;\;\;\;\;\,=\frac{\text{总面积-下面的面积}}{\text{总面积}}\)
\(\;\;\;\;\;\;\;\;\;\;\;\;\;\,=\frac{ab-S\times (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就是这样子辣,喵喵喵(概率论真是很可爱呢)