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
题意:求两点的最短距离;可以根据时间 t 将距离方程列出,求出二元一次方程的 a,b,c;
1.如果a=0;即A,B两点的速度都是相等的;那么就把最开始时刻的距离输出;
2.如果a!=0;求出抛物线的顶点的值,(-b/2a , -b/4a+c);然后与初始时刻的点的距离比较,输出较小的;
# include <iostream>
# include <cstdio>
# include <cmath>
using namespace std;
#define maxn 0xfffffff
int main()
{
//freopen("a.txt","r",stdin);
int t;
scanf("%d",&t);
while(t--)
{
int ax,ay,bx,by,vax,vay,vbx,vby;
double a,b,c,s,ans;
ans=maxn;
scanf("%d%d%d%d",&ax,&ay,&vax,&vay);
scanf("%d%d%d%d",&bx,&by,&vbx,&vby);
a=(vax-vbx)*(vax-vbx)+(vay-vby)*(vay-vby);
b=2*((vax-vbx)*(ax-bx)+(vay-vby)*(ay-by));
c=(ax-bx)*(ax-bx)+(ay-by)*(ay-by);
if(a==0) printf("%.8lf\n",sqrt(c));
else
{
s=-b/a/2;
if(s>0) ans=(4*a*c-b*b)/a/4;
ans=sqrt(ans);
c=sqrt(c);
printf("%.8lf\n",ans>c ? c:ans);
}
}
return 0;
}