题目大意:你和朋友都要乘坐火车,并且都会途径A城市。你们很想会面,但是你们到达这个城市的准确时刻都无法确定。你会在时间区间[t1,t2]的任意时刻以相同的概率密度到达。你朋友则会在时间区间[s1,s2]内的任意时刻以相同的概率密度到达。你们的火车都会在A城市停留w分钟。只有在同一时刻,你们所在的火车都停在城市A的时候,才有可能会面。你的任务是计算出现这种情况的概率。
题目分析:假设x和y分别是两辆火车走到城市A的时间,则整个概率空间是平面上的一个矩形。两个人相遇的条件是|x-y|<=W。因此这个矩形被直线y=x+w和直线y=x-w切割后的中间的图形的面积除以总的矩形的面积就是所求概率。对切割后的面积大小进行分类讨论即可。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#include<cmath>
#include<cctype>
#include<cassert>
#include<climits>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define RepD(i,n) for(int i=n;i>=0;i--)
#define MEM(a) memset(a,0,sizeof(a))
#define MEMI(a) memset(a,127,sizeof(a))
#define MEMi(a) memset(a,128,sizeof(a))
#define INF (2139062143)
#define phiF (1000000006)
#define MAXN (1000000+10)
typedef long long LL;
int T,t1,t2,s1,s2,w;
double sum,ans;
inline void work(){
ans=2*(t2-t1)*(s2-s1);
if (t1+w>=s1 && t1+w<=s2){
if (s2-w>=t1 && s2-w<=t2) ans-=(s2-t1-w)*(s2-w-t1);
else ans-=(s2-t1-w+s2-t2-w)*(t2-t1);
}
else if (s1-w>=t1 && s1-w<=t2){
if (s2-w>=t1 && s2-w<=t2) ans-=(s1-w-t1+s2-w-t1)*(s2-s1);
else ans-=2*(t2-t1)*(s2-s1)-(t2-s1+w)*(t2+w-s1);
}
if (t1-w>=s1 && t1-w<=s2){
if (s2+w>=t1 && s2+w<=t2) ans-=2*(t2-t1)*(s2-s1)-(s2-t1+w)*(s2+w-t1);
else ans-=(t1-w-s1+t2-w-s1)*(t2-t1);
}
else if (s1+w>=t1 && s1+w<=t2){
if (s2+w>=t1 && s2+w<=t2) ans-=(t2-s1-w+t2-s2-w)*(s2-s1);
else ans-=(t2-s1-w)*(t2-w-s1);
}
if (t2+w<=s1 || s2+w<=t1){
ans=0;
}
}
int main(){
int Case=0;
scanf("%d",&T);
while (T--){
scanf("%d%d%d%d%d",&t1,&t2,&s1,&s2,&w);
/*if (s2-s1>t2-t1) {
swap(s2,t2);swap(s1,t1);
}*/
sum=(t2-t1)*(s2-s1);
work();
printf("Case #%d: ",++Case);
printf("%.8f\n",double (0.5*ans/sum));
}
}