首页 > 代码库 > CSU 1407: 最短距离(数学啊 )
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个整数xA, yA, vAx, vAy (-103 ≤ xA, yA, vAx, vAy ≤ 103),表示t = 0时刻A的坐标为(xA, yA),A的速度在x轴方向上的分量为vAx,在y轴上的分量为vAy。第二行包含四个整数xB, yB, vBx, vBy (-103 ≤ xB, yB, vBx, vBy ≤ 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: 最短距离(数学啊 )
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。