meeting——神奇的数学解法
Meeting
【题目描述】
Spray 和Ray 想要在X时刻和Y时刻之间的某个时候会面,但是这两个人都不是很准时的……所以它们没有商定会面的确切时间。但是它们商量好,谁要是先到了,就等对方Z分钟时间。但是它们两个都会在X点和Y点之间的某时刻出现,只是不一定会碰到。
现在,请你计算他们两个碰面的概率。
【输入格式】
输入数据有多组测试数据
每组测试数据包含两个整数X和Y(0<=x<y<=24)和一个实数Z(0<Z<=60*(Y-X))
【输出格式】
对于每组测试数据
输出一行,为计算出的概率,保留小数点后6位,第7位四舍五入。
【输入样例】
11 12 20
【输出样例】
0.555556
分析:
这道题的解法是利用线性规划的数学知识,
但是还有一种更为神奇的方法,
这里简单说一下。。
首先,是这样的,
设一个t变量,t=z/((y-x)*60)
然后直接ans=(1-t)*t+t得解。。。
相当精当。。。
用图解释一下。。。
如图,
首先,我们不妨设,先到的人在A'时刻~B'时刻(y时刻)间到达,那么后到的人一定会与先到的人碰面,这样的话相遇的概率为z/((y-x)*60){注:即我们先前设的t}
{注:这里的概率为先到的人在A'~B'间到达的概率}
接着,我们由上面的假设,
先到的人在A~B间到达的概率为(1-t)
后到的人在他们可以相遇的区间内到达的概率也为t
这样的话,他们在该情况下相遇的概率为(1-t)*t
综上所述:ans=(1-t)*t+t
看代码吧,异常简洁。
program meeting; var i,j,n,m,k,l:longint; x,y,z,t,ans:real; begin assign(input,'meeting.in'); reset(input); assign(output,'meeting.out'); rewrite(output); while not eof do begin readln(x,y,z); t:=z/((y-x)*60); ans:=(1-t)*t+t; writeln(ans:0:6); end; close(input); close(output); end.