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

看代码吧,异常简洁。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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   codeway3  阅读(238)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?

导航

< 2011年10月 >
25 26 27 28 29 30 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示