有两个人分别从a到b,从c到d匀速行走,且同时出发,同时到达,问两人在行走过程中的最短距离是多少.
因为距离的函数图像为有峰点的二次函数,故可以用三分法来做.
由两人匀速且同时出发,同时到达可得,两人在等比例地行走.故可以通过精确两人的位置来求最短距离
#include
#define db double
using namespace std;
int T,TT,tot;
db ans,ax,ay,bx,by,cx,cy,dx,dy;
db jl(db u1,db u2,db v1,db v2)
{
return sqrt((u1-v1)*(u1-v1)+(u2-v2)*(u2-v2));
}
void find(db a1,db a2,db b1,db b2,db c1,db c2,db d1,db d2)
{
tot--;
if(!tot) return;
db m1,m2;
m1=jl((a1+b1)/2,(a2+b2)/2,(c1+d1)/2,(c2+d2)/2);
m2=jl(a1-(a1-b1)/4,a2-(a2-b2)/4,c1+(d1-c1)/4,c2+(d2-c2)/4);
if(m1>m2)
{
ans=min(ans,m2);
find(a1,a2,(a1+b1)/2,(a2+b2)/2,c1,c2,(c1+d1)/2,(c2+d2)/2);
}
else
{
ans=min(ans,m1);
find(a1-(a1-b1)/4,a2-(a2-b2)/4,b1,b2,c1-(c1-d1)/4,c2-(c2-d2)/4,d1,d2);
}
}
int main()
{
int i,j;
cin>>T;
TT=T;
while(T--)
{
scanf("%lf%lf%lf%lf%lf%lf%lf%lf",&ax,&ay,&bx,&by,&cx,&cy,&dx,&dy);
tot=2000;
ans=100000000;
find(ax,ay,bx,by,cx,cy,dx,dy);
printf("Case %d: %.10lf\n",TT-T,ans);
}
}