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

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


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

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


代码如下:

#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)