您的位置:首页 > 其它

概率(和朋友会面,UVA 11722)

2016-11-22 11:27 417 查看
横坐标t表示你的时间,纵坐标s表示你朋友的时间。

因为你的火车会在[t1,t2]时间段内等概率的到达,你朋友的火车会在[s1,s2]时间段内等待率的到达。

所以由t=t1,t=t2,s=s1,s=s2四条直线围成的矩形就是概率空间,设这个区域为A。点(t,s)在矩形内表示你和你朋友分别在t时刻与s时刻刚好到达这座城市。矩形内每个点发生的概率都相等。由于火车到达后一定会停留w分钟,所以当且仅当你们到达的时刻之差小于w时,你们就一定会相遇。也就是|s-t|<w,即s=t+w与s=t-w两条直线之间的区域。设这个区域为B。答案就是|A∩B|/|A|。表示P(B|A)/P(A)。说得直白一点就是中间的那个“类似菱形的图形”的面积除以整个矩形的面积就是所求概率。表示你们相遇的情况除以所有情况。

问题就转化成了求一个矩形被两条斜率为1的直线截出的面积。

首先s,t可以互换,不妨设s2-s1<t2-t1。也就是说这是一个躺着的矩形。

快速解决的办法就是先在四个角作斜率为1的辅助线,然后用讨论分别计算出两条直线非阴影部分的面积S1,S2。

设总面积为S,那么阴影部分的面积就是(S-S1-S2)。概率就是(S-S1-S2)/S。

代码

#include<bits/stdc++.h>
using namespace std;

double t1,t2,s1,s2,w;
double h1,h2,h3,h4;
double w1,w2;

double solve()
{
double MJ1,MJ2;

double S=(s2-s1)*(t2-t1);
double SJ=(s2-s1)*(s2-s1)/2;

if(w1>h1) MJ1=0;
else if(w1>h2) MJ1=(h1-w1)*(h1-w1)/2;
else if(w1>h3) MJ1=(h2-w1)*(s2-s1)+SJ;
else if(w1>h4) MJ1=S-(w1-h4)*(w1-h4)/2;
else MJ1=S;

if(w2<h4) MJ2=0;
else if(w2<h3) MJ2=(w2-h4)*(w2-h4)/2;
else if(w2<h2) MJ2=(w2-h3)*(s2-s1)+SJ;
else if(w2<h1) MJ2=S-(h1-w2)*(h1-w2)/2;
else MJ2=S;

return (S-MJ1-MJ2)/S;
}

int main()
{
int T;
scanf("%d",&T);
for(int t=1;t<=T;t++)
{
scanf("%lf %lf %lf %lf %lf",&t1,&t2,&s1,&s2,&w);
if(s2-s1>t2-t1)
{
swap(s1,t1);
swap(s2,t2);
}
h1=s2-t1;
h2=s1-t1;
h3=s2-t2;
h4=s1-t2;
w1=w;
w2=-w;
printf("Case #%d: %.8lf\n",t,solve());
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: