Description
两个点
A
,
B
均在做匀速直线运动。给出
t
= 0时刻
A
,
B
的坐标,以及
A
,
B
的速度,计算
t
≥
0时两个点的距离的最小值。
Input
输入的第一行包含一个整数
T
(1
≤
T
≤
200
),表示一共有
T
组测试数据。
对于每组测试数据,第一行包含4个整数
x
A
,
y
A
,
v
Ax
,
v
Ay
(-10
3
≤
x
A
,
y
A
,
v
Ax
,
v
Ay
≤
10
3
),表示
t
= 0时刻
A
的坐标为(
x
A
,
y
A
),
A
的速度在
x
轴方向上的分量为
v
Ax
,在
y
轴上的分量为
v
Ay
。第二行包含四个整数
x
B
,
y
B
,
v
Bx
,
v
By
(-10
3
≤
x
B
,
y
B
,
v
Bx
,
v
By
≤
10
3
),以相同的方式给出了
B
的各项属性。
Output
对于每组测试数据,输出
t
≥
0时两个点距离的最小值,保留8位小数。
Sample Input
6
0 0 0 0
0 1 0 1
0 0 -1 1
0 0 1 -1
0 1 1 0
2 0 0 1
0 1 1 0
2 0 1 0
0 0 -1 1
1 1 1 -1
997 997 -1000 -1000
-1000 -1000 1000 1000
Sample Output
1.00000000
0.00000000
0.70710678
2.23606798
1.41421356
0.00000000
HINT
Source
距离d为关于t的二次函数,分情况讨论下就ok了
#include<iostream>
#include<math.h>
using namespace std;
main()
{
int n;
scanf("%d",&n);
float a,b,c,xa,ya,vax,vay,xb,yb,vbx,vby;
while(n--)
{
scanf("%f%f%f%f%f%f%f%f",&xa,&ya,&vax,&vay,&xb,&yb,&vbx,&vby);
a=(vax-vbx)*(vax-vbx)+(vay-vby)*(vay-vby);
b=2*((xa-xb)*(vax-vbx)+(ya-yb)*(vay-vby));
c=(xa-xb)*(xa-xb)+(ya-yb)*(ya-yb);
if(a==0)printf("%.8f\n",sqrt(c));
else if((-b)/(2*a)>0)printf("%.8f\n",sqrt((4*a*c-b*b)/4/a));
else printf("%.8f\n",sqrt(c));
}
}