题目描述(建议先做完前10题再做这道题)
HugeGun学姐过生日辣,今天是大家上机的日子,也是学姐开始奔三的日子。
她在聚会上玩扔三角形的游戏:
在坐标系上有无数条平行的,间隔为LL的平行直线。学姐手里拿着边长为ll的等边三角形,她随手一挥,三角形便会落在坐标系中,她想求助你帮她计算三角形和任意直线相交的概率是多少,可以认为三角形落地时的角度和位置随机(均匀)。聪明而睿智的你必然会帮助她。
输入
第一个数为数据组数n
接下来n行,每行2个用空格分开的整数L,l
输出
对于每组数据,输出一行一个浮点数,表示答案,四舍五入保留到小数点后6位。
输入样例
2
2 1
2 3
输出样例
0.477465
1.000000
数据范围
1≤n≤10^4
1≤L,l≤100
挺有意思的一道数学题,思路是期望+积分,下面给出具体的解
我们不妨将所有平行线都认为是竖直的,而三角形与平行线是否有交点其实等价于将三角形投影到水平方向后所得到的直线是否与这些平行线有交点。
(由于没有搞到免费的几何画板,就不给图了)
情况1.
这意味着三角形最短可能的投影都与平行线会产生交点,所以概率一定为1
情况2.
这种情况下,一定存在一个位置,使三角形最长的投影都不会与平行线产生交点,即两条平行线之间可以容纳任何一种姿态的等边三角形
(不知道为啥,图像不能旋转,凑合着看吧)
设如图所示角为
由于等边三角形优美的对称性,我们只需要考虑
时,三角形与平行线相交的概率
概率为
(图像倒不过来了,凑合着人脑翻译一下)
化简一下就可以知道概率为
情况3. 且
这种情况的话意味着会存在一个角
当时,
,即概率为1
而时,再用情况二的方法积分+期望求解
公式写着有点复杂,自己推推吧
最后直接上代码:
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<stdlib.h>
#include<ctype.h>
double pi=3.14159265358979;
int main(){
int T,L,l;
scanf("%d",&T);
while(T--){
scanf("%d%d",&L,&l);
if(sqrt(3)/2*l>=L) printf("%.6lf",1.0);
else if(l<L) printf("%.6lf",1.0*3/pi*l/L);
else{
double t=acos(1.0*L/l);
printf("%.6lf",1.0*l*(0.5-sin(t))/(L*(pi/6))+t/(pi/6));
}
putchar(10);
}
}