Closest Distance LightOJ - 1146

题面

题意

有两个人分别从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);
	}
}

你可能感兴趣的:(技巧,经典)