题意:你和你的朋友要乘坐火车,并且都会在A城市相遇,你会在(t1,t2)中的任意时刻以相同的概率密度到达,
你朋友会在(s1,s2)中的任意时刻以相同的概率密度到达,你们的火车在A城市都会停留w分钟,只有在同一时刻你们的火车停留在A城市,你们才可能相见,
问你们相见的概率为多少
题解:假设x是你到A站的时间,y是你朋友到达A站时间,那么只要满足|x-y|<=w;你和你的朋友便可以相见,这个就和我们高中的线性规划一样=x+w;y=x-w这两条直线在正方(t1,t2,s1,s2)所围成的长方形的面积
我们只要计算阴影面积就可以,就是用y=x+w围成的面积-y=x-w围成的面积,不过要分情况考虑,具体看代码
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstring> 5 #include<algorithm> 6 #include<queue> 7 #include<map> 8 #include<set> 9 #include<vector> 10 #include<cstdlib> 11 #include<string> 12 #define eps 0.000000001 13 typedef long long ll; 14 typedef unsigned long long LL; 15 using namespace std; 16 int t1,t2,s1,s2; 17 double sum; 18 double solve(int w){ 19 double ans=0; 20 if(t2+w<=s1)return 0; 21 else if(t1+w>=s2)return sum; 22 if(t1+w>=s1&&t2+w>=s2){ 23 ans=sum-0.5*(s2-t1-w)*(s2-t1-w); 24 return ans; 25 } 26 if(t1+w<=s1&&t2+w<=s2){ 27 ans=0.5*(t2-s1+w)*(t2-s1+w); 28 return ans; 29 } 30 if(t1+w<=s1&&t2+w>=s2){ 31 ans=0.5*(s2-s1)*(2*t2-s1-s2+2*w); 32 return ans; 33 } 34 if(t1+w>=s1&&t2+w<=s2){ 35 ans=0.5*(t2-t1)*(t1+t2-2*s1+2*w); 36 return ans; 37 } 38 } 39 int main(){ 40 int t; 41 int w; 42 scanf("%d",&t); 43 int Case=1; 44 while(t--){ 45 scanf("%d%d%d%d%d",&t1,&t2,&s1,&s2,&w); 46 sum=1.0*abs(t1-t2)*abs(s1-s2); 47 double ans=solve(w)+solve(-w); 48 double t=solve(w)-solve(-w); 49 printf("Case #%d: %.8lf\n",Case++,t/sum); 50 } 51 }