首页 > 代码库 > CSU 1407: 最短距离(数学啊 )

CSU 1407: 最短距离(数学啊 )

题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1407


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

中南大学第八届大学生程序设计竞赛


代码如下:

#include <cstdio>
#include <cmath>
#include <cstring>

int main()
{
    int t;
    double xa, ya, vax, vay;
    double xb, yb, vbx, vby;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%lf%lf%lf%lf",&xa,&ya,&vax,&vay);
        scanf("%lf%lf%lf%lf",&xb,&yb,&vbx,&vby);
        //dis^2 = a*t^2+b*t+c
        double a = ((vax-vbx)*(vax-vbx)+(vay-vby)*(vay-vby)); //a一定>=0
        double b = 2*(xa*(vax-vbx)+xb*(vbx-vax)+ya*(vay-vby)+yb*(vby-vay));
        double c = xa*(xa-2*xb)+ya*(ya-2*yb)+yb*yb+xb*xb;
        double dis1 = 0, dis2 = 0, dis3 = 0;
        double xx = -(2*a)/b;//顶点坐标
        double yy = sqrt((4*a*c-b*b)/(4*a));

        double d = -b/(2*a);//解:求导得:2*a*x+b = 0;
        if(a == 0)
        {
            dis1 = sqrt(c);
            printf("%.8lf\n",dis1);
        }
        else if(a > 0)
        {
            if(d >= 0)
            {
                dis2 = yy;
            }
            else
            {
                dis2 = sqrt(c);
            }
            printf("%.8lf\n",dis2);
        }
//        printf("dis1:%.8lf\n",dis1);
//        printf("dis2:%.8lf\n",dis2);
    }
    return 0;
}


CSU 1407: 最短距离(数学啊 )