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得解。。。

相当精当。。。

用图解释一下。。。meeting——神奇的数学解法

如图,

首先,我们不妨设,先到的人在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.

你可能感兴趣的:(in)