两个点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;
}
原文:http://blog.csdn.net/u012860063/article/details/41789255