#19237. 太空碎片轨迹预测

太空碎片轨迹预测

数学是宇宙通用的语言,而抛物线(Quadratic Function)则是重力井中最优雅的舞步。

对于初中生来说,理解判别式(Discriminant) Δ=b24ac\Delta = b^2 - 4ac 的物理意义至关重要:它决定了两个物体是否会相撞,是一次擦肩而过,还是一场毁灭性的碰撞。

我为你构思了一道结合了物理运动学与数学二次方程的题目。


[OI 题库] 机器人“丹尼尔”的轨迹预判 (Daneel's Trajectory)

题目背景

“如果一个机器人能够瞬间计算出抛物线的落点,那么它接住掉落的苹果就不需要奇迹,只需要数学。” —— 《我,机器人》

在太空殖民地,R·丹尼尔(R. Daneel)是一款搭载了正子脑的先进机器人。他的任务是拦截可能会撞击生态穹顶的太空碎片。

根据雷达探测,碎片的飞行轨迹的高度 hh 与时间 tt 的关系符合二次函数:

h(t)=at2+bt+ch(t) = at^2 + bt + c

其中:

  • tt 代表时间(秒)。
  • h(t)h(t) 代表碎片距离地面的高度(米)。
  • a,b,ca, b, c 是由环境引力和初速度决定的系数。

你需要编写程序,计算碎片会在什么时间点撞击地面(即 h(t)=0h(t) = 0 的时刻)。

题目描述

输入三个浮点数 a,b,ca, b, c,分别代表二次函数的系数。 请利用求根公式解方程 at2+bt+c=0at^2 + bt + c = 0

根据判别式 Δ=b24ac\Delta = b^2 - 4ac 的情况,输出不同的结果:

  1. 无法撞击 (Δ<0\Delta < 0):碎片将永远不会到达地面(可能飞向太空了)。输出 No Impact
  2. 擦肩而过 (Δ=0\Delta = 0):碎片轨迹与地面相切,只有一个接触瞬间。输出该时间点。
  3. 发生撞击 (Δ>0\Delta > 0):方程有两个解。输出这两个时间点。
    • 注意:请按照时间从小到大的顺序输出。

输入格式

一行,包含三个浮点数 a,b,ca, b, c。 (保证 a0a \neq 0)。

输出格式

  • 若无解,输出 No Impact
  • 若有一个解,输出一个浮点数,保留两位小数。
  • 若有两个解,输出两个浮点数,中间用空格分隔,保留两位小数。

样例数据

样例 1 (正常落地)

-5 10 15
-1.00 3.00

(解析:方程 5t2+10t+15=0-5t^2 + 10t + 15 = 0。化简得 t22t3=0t^2 - 2t - 3 = 0,解为 t1=1,t2=3t_1=-1, t_2=3)

样例 2 (相切/单点接触)

1 -2 1
1.00

(解析:Δ=(2)24×1×1=0\Delta = (-2)^2 - 4\times1\times1 = 0。解为 t=1t=1)

样例 3 (无解)

1 0 5
No Impact

(解析:Δ=020=20<0\Delta = 0 - 20 = -20 < 0)

数据范围

  • a,b,ca, b, c 均为浮点数,绝对值不超过 10001000
  • a0a \neq 0

阿西莫夫的解题指南

这道题是数学与编程的完美结合,考察了三个核心点:

  1. 判别式的计算:首先计算 delta = b*b - 4*a*c
  2. 浮点数的运算:需要使用 sqrt() 函数(需包含 <cmath> 头文件)。
  3. 逻辑分支
    • if (delta < 0):无实数根。
    • if (delta == 0):利用公式 x=b/(2a)x = -b / (2a)
    • if (delta > 0):利用公式 x=b±Δ2ax = \frac{-b \pm \sqrt{\Delta}}{2a}

特别提醒(给初学者的陷阱):a<0a < 0 时(这在物理抛物线中很常见,因为重力向下),求根公式中的 b+Δ2a\frac{-b + \sqrt{\Delta}}{2a} 可能会比 bΔ2a\frac{-b - \sqrt{\Delta}}{2a} 小。 为了稳妥起见,计算出两个根 x1,x2x_1, x_2 后,建议使用 std::minstd::max 或者手动 if 交换,确保从小到大输出。