题解:UVA10794 The Deadly Olympic Returns!!!
never_check · · 题解
解题思路
首先读取测试用例的数量 T。
对于每个测试用例:
- 读取时间 time。
- 读取第一个导弹的起始位置 (x1, y1, z1) 和经过 time 秒后的位置 (x2, y2, z2),通过计算 (x2 - x1) / time、(y2 - y1) / time、(z2 - z1) / time 得到第一个导弹的速度向量 (vx1, vy1, vz1)。
- 同样地,读取第二个导弹的相关信息并计算其速度向量 (vx2, vy2, vz2)。
- 根据两个导弹的运动方程,设相遇时间为 t,列出关于 t 的二次方程 a
t^2 + b t + c = 0, - 其中:
a = vx1 vx1 + vy1 vy1 + vz1 vz1 + vx2 vx2 + vy2 vy2 + vz2 vz2。b = 2 (vx1 (x1 - x2) + vy1 (y1 - y2) + vz1 (z1 - z2) + vx2 (x2 - x1) + vy2 (y2 - y1) + vz2 * (z2 - z1))。c = (x1 - x2) (x1 - x2) + (y1 - y2) (y1 - y2) + (z1 - z2) * (z1 - z2)。 - 求解二次方程得到相遇时间 t,如果判别式小于 0,则说明没有相遇点(这里设 t 为 0,
- 根据相遇时间 t 计算两个导弹的相遇点坐标 (meetX1, meetY1, meetZ1) 和 (meetX2, meetY2, meetZ2)。
最后
- 计算并输出两个相遇点之间的距离,保留四位小数。
通过以上步骤,程序可以计算出两个导弹在运动过程中的最小可能距离,并按照要求的格式输出结果。
部分代码
// 计算两点之间的距离
double distance(double x1, double y1, double z1, double x2, double y2, double z2) {
return sqrt((x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2) + (z1 - z2) * (z1 - z2));
}