两个点
A
,
B
均在做匀速直线运动。给出
t
= 0时刻
A
,
B
的坐标,以及
A
,
B
的速度,计算
t
≥
0时两个点的距离的最小值。
题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1407
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
1.00000000
0.00000000
0.70710678
2.23606798
1.41421356
0.00000000
中南大学第八届大学生程序设计竞赛
代码如下:
#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; }