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

来源:互联网 发布:js实现动态时钟 编辑:程序博客网 时间:2024/06/02 17:31

题目链接: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

60 0 0 00 1 0 10 0 -1 10 0 1 -10 1 1 02 0 0 10 1 1 02 0 1 00 0 -1 11 1 1 -1997 997 -1000 -1000-1000 -1000 1000 1000

Sample Output

1.000000000.000000000.707106782.236067981.414213560.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;}


1 0
原创粉丝点击