Uva11722 Joining with Friend

本文介绍了一种计算两辆火车在特定城市停留期间会面概率的方法。通过分析火车到达时间区间,利用几何概率原理,计算出两人在火车停留期间会面的可能性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意:你和朋友都要乘坐火车,并且都会途径A城市。你们很想会面,但是你们到达这个城市的准确时刻都无法确定。你会在时间区间[t1,t2]的任意时刻以相同的概率密度到达。你朋友则会在时间区间[s1,s2]内的任意时刻以相同的概率密度到达。你们的火车都会在A城市停留w分钟。只有在同一时刻,你们所在的火车都停在城市A的时候,才有可能会面。你的任务是计算出现这种情况的概率。


题目分析:假设x和y分别是两辆火车走到城市A的时间,则整个概率空间是平面上的一个矩形。两个人相遇的条件是|x-y|<=W。因此这个矩形被直线y=x+w和直线y=x-w切割后的中间的图形的面积除以总的矩形的面积就是所求概率。对切割后的面积大小进行分类讨论即可。


#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<functional>
#include<cmath>
#include<cctype>
#include<cassert>
#include<climits>
using namespace std;
#define For(i,n) for(int i=1;i<=n;i++)
#define Rep(i,n) for(int i=0;i<n;i++)
#define Fork(i,k,n) for(int i=k;i<=n;i++)
#define ForD(i,n) for(int i=n;i;i--)
#define Forp(x) for(int p=pre[x];p;p=next[p])
#define RepD(i,n) for(int i=n;i>=0;i--)
#define MEM(a) memset(a,0,sizeof(a))
#define MEMI(a) memset(a,127,sizeof(a))
#define MEMi(a) memset(a,128,sizeof(a))
#define INF (2139062143)
#define phiF (1000000006)
#define MAXN (1000000+10)
typedef long long LL;

int T,t1,t2,s1,s2,w;
double sum,ans;

inline void work(){
		ans=2*(t2-t1)*(s2-s1);
		if (t1+w>=s1 && t1+w<=s2){
			if (s2-w>=t1 && s2-w<=t2) ans-=(s2-t1-w)*(s2-w-t1);
				else ans-=(s2-t1-w+s2-t2-w)*(t2-t1);
		}
		else if (s1-w>=t1 && s1-w<=t2){
			if (s2-w>=t1 && s2-w<=t2) ans-=(s1-w-t1+s2-w-t1)*(s2-s1);
				else ans-=2*(t2-t1)*(s2-s1)-(t2-s1+w)*(t2+w-s1);
		}
		
		if (t1-w>=s1 && t1-w<=s2){
			if (s2+w>=t1 && s2+w<=t2) ans-=2*(t2-t1)*(s2-s1)-(s2-t1+w)*(s2+w-t1);
				else ans-=(t1-w-s1+t2-w-s1)*(t2-t1);
		}
		else if (s1+w>=t1 && s1+w<=t2){
			if (s2+w>=t1 && s2+w<=t2) ans-=(t2-s1-w+t2-s2-w)*(s2-s1);
				else ans-=(t2-s1-w)*(t2-w-s1);
		}
		if (t2+w<=s1 || s2+w<=t1){
			ans=0;
		}
}


int main(){
	int Case=0;
	scanf("%d",&T);
	while (T--){
		scanf("%d%d%d%d%d",&t1,&t2,&s1,&s2,&w);
		/*if (s2-s1>t2-t1) {
			swap(s2,t2);swap(s1,t1);
		}*/
		sum=(t2-t1)*(s2-s1);
		work();
		printf("Case #%d: ",++Case);
		printf("%.8f\n",double (0.5*ans/sum));
	}
	
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值