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

横坐标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;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值