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.

posted on 2011-10-29 06:09  codeway3  阅读(236)  评论(0编辑  收藏  举报

导航