关闭

最短距离

188人阅读 评论(0) 收藏 举报
分类:


Description

两个点AB均在做匀速直线运动。给出t = 0时刻AB的坐标,以及AB的速度,计算t  0时两个点的距离的最小值。

Input

输入的第一行包含一个整数T (1  T  200),表示一共有T组测试数据。
对于每组测试数据,第一行包含4个整数xAyAvAxvAy (-103  xAyAvAxvAy  103),表示t = 0时刻A的坐标为(xAyA),A的速度在x轴方向上的分量为vAx,在y轴上的分量为vAy。第二行包含四个整数xByBvBxvBy (-103  xByBvBxvBy  103),以相同的方式给出了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));
  
 }
}

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:35087次
    • 积分:1519
    • 等级:
    • 排名:千里之外
    • 原创:120篇
    • 转载:16篇
    • 译文:0篇
    • 评论:0条