概率(和朋友会面,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;
}
因为你的火车会在[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;
}
相关文章推荐
- UVa 11722 - Joining with Friend (概率 数形结合)
- UVA - 11722 Joining with Friend (概率)
- UVA - 11722 Joining with Friend 几何概率
- UVA 11722 Joining with Friend [连续概率]
- UVA 11722 Joining with Friend 图形面积+概率
- UVA11722(见面概率)
- UVA 11722 Joining with Friend【概率】
- UVA 11722 - Joining with Friend(概率)
- uva 11722 - Joining with Friend(概率)
- uva 11722 - Joining with Friend(概率)
- UVa 11722 Joining with Friend (几何概率 + 分类讨论)
- uva11722(概率)
- UVa 11722 (概率 数形结合) Joining with Friend
- uva11722 - Joining with Friend(几何概率)
- UVA 11722 概率几何
- UVA 10828 - Back to Kernighan-Ritchie(概率+高斯消元)
- UVALive 6620 Josephina and RPG(概率DP)
- UVA 11021 Tribbles【概率】
- UVA 12230 - Crossing Rivers(概率)
- UVA 11762 - Race to 1(概率)