UVA 11722 Joining with Friend【概率】

题意:

给定两个人火车到站的时间范围,以及火车的停留时间,问两个人相遇的概率。

分析:

好经典的高中数学题(?)
放在坐标系中,即转化为区域 |yx|w 与横坐标 [t1,t2| ,纵坐标 [s1,s2] 围成的矩形区域的面积交是多少。
两条直线与矩形边围成的阴影区域面积不好算,而阴影面积之外的区域基本都是三角形或者梯形,好算很多,所以我们对 w <script type="math/tex" id="MathJax-Element-275">w</script>进行分类讨论,直接求出阴影外的面积,用总面积减一下即可。
没啥难度,就是分类讨论这里需要想清楚。

代码:

/*************************************************************************
    > File Name: 11722.cpp
    > Author: jiangyuzhu
    > Mail: 834138558@qq.com 
    > Created Time: 2016/8/1 10:12:23
 ************************************************************************/

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#include<set>
#include<map>
#include<algorithm>
using namespace std;
int main (void)
{
    int T;
    scanf("%d", &T);
    double s1, s2, t1, t2, w;
    for(int tt = 1; tt <= T; tt++){
        //cin>>t1>>t2>>s1>>s2>>w;
        scanf("%lf%lf%lf%lf%lf", &t1, &t2, &s1, &s2, &w);
        double tot = (t2 - t1) * (s2 - s1);
        double sum = 0;
        if(t1 + w < s2 && t1 + w >= s1){
            if(t2 + w >= s2) sum += 0.5 * (s2 - t1 - w) * (s2 - t1 - w);
            else sum += 0.5 * (s2 - t2 - w + s2 - t1 - w) * (t2 - t1);
        }else if(t1 + w >= s2 ) sum += 0;
        else {
            if(t2 + w > s2){
                sum += 0.5 * (s2 - s1) * (s1 - w - t1 + s2 - w - t1);
            }else if(t2 + w <= s2 && t2 + w > s1){
                sum += tot - 0.5 * (t2 + w - s1) * (t2 + w - s1);
            }else sum += tot;
        }
        if(t2 - w <= s1) sum += 0;
        else if(t2 - w > s1 && t2 - w <= s2){
            if(t1 - w <= s1) sum += 0.5 * (t2 - w - s1) * (t2 - w - s1);
            else  sum += 0.5 * (t2 - t1) * (t2 - w - s1 + t1 - w - s1);
        }else if(t2 - w > s2){
            if(t1 - w <= s1) sum += (t2 - s1 - w + t2 - s2 - w) * (s2 - s1) * 0.5;
            else if(t1 - w > s1 && t1 - w < s2){
                sum += tot - 0.5 * (s2 - t1 + w) * (s2 - t1 + w);
            }else sum += tot;
        }
        printf("Case #%d: %.10f\n", tt, (tot - sum) / tot);
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值