题意:
给定两个人火车到站的时间范围,以及火车的停留时间,问两个人相遇的概率。
分析:
好经典的高中数学题(?)
放在坐标系中,即转化为区域
|y−x|≤w
与横坐标
[t1,t2|
,纵坐标
[s1,s2]
围成的矩形区域的面积交是多少。
两条直线与矩形边围成的阴影区域面积不好算,而阴影面积之外的区域基本都是三角形或者梯形,好算很多,所以我们对
w
<script type="math/tex" id="MathJax-Element-275">w</script>进行分类讨论,直接求出阴影外的面积,用总面积减一下即可。
没啥难度,就是分类讨论这里需要想清楚。
代码:
/*************************************************************************
> File Name: 11722.cpp
> Author: jiangyuzhu
> Mail: 834138558@qq.com
> Created Time: 2016/8/1 10:12:23
************************************************************************/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<algorithm>
using namespace std;
int main (void)
{
int T;
scanf("%d", &T);
double s1, s2, t1, t2, w;
for(int tt = 1; tt <= T; tt++){
//cin>>t1>>t2>>s1>>s2>>w;
scanf("%lf%lf%lf%lf%lf", &t1, &t2, &s1, &s2, &w);
double tot = (t2 - t1) * (s2 - s1);
double sum = 0;
if(t1 + w < s2 && t1 + w >= s1){
if(t2 + w >= s2) sum += 0.5 * (s2 - t1 - w) * (s2 - t1 - w);
else sum += 0.5 * (s2 - t2 - w + s2 - t1 - w) * (t2 - t1);
}else if(t1 + w >= s2 ) sum += 0;
else {
if(t2 + w > s2){
sum += 0.5 * (s2 - s1) * (s1 - w - t1 + s2 - w - t1);
}else if(t2 + w <= s2 && t2 + w > s1){
sum += tot - 0.5 * (t2 + w - s1) * (t2 + w - s1);
}else sum += tot;
}
if(t2 - w <= s1) sum += 0;
else if(t2 - w > s1 && t2 - w <= s2){
if(t1 - w <= s1) sum += 0.5 * (t2 - w - s1) * (t2 - w - s1);
else sum += 0.5 * (t2 - t1) * (t2 - w - s1 + t1 - w - s1);
}else if(t2 - w > s2){
if(t1 - w <= s1) sum += (t2 - s1 - w + t2 - s2 - w) * (s2 - s1) * 0.5;
else if(t1 - w > s1 && t1 - w < s2){
sum += tot - 0.5 * (s2 - t1 + w) * (s2 - t1 + w);
}else sum += tot;
}
printf("Case #%d: %.10f\n", tt, (tot - sum) / tot);
}
return 0;
}