如果固定了一个点,另一个点可以三分。所以我们就三分套一个三分
#include<cstdio>
#include<cmath>
const double eps=1e-8;
double ax,ay,bx,by,cx,cy,dx,dy,p,q,r;
double get(double xa,double ya,double xb,double yb)
{
return sqrt((xa-xb)*(xa-xb)+(ya-yb)*(ya-yb));
}
double cal(double x,double y)
{
double lx=cx,ly=cy,rx=dx,ry=dy,lmx,lmy,rmx,rmy,t1,t2;
while(fabs(lx-rx)>eps||fabs(ly-ry)>eps)
{
lmx=lx+(rx-lx)/3;
lmy=ly+(ry-ly)/3;
rmx=rx-(rx-lx)/3;
rmy=ry-(ry-ly)/3;
t1=get(dx,dy,lmx,lmy)/q+get(x,y,lmx,lmy)/r;
t2=get(dx,dy,rmx,rmy)/q+get(x,y,rmx,rmy)/r;
if(t1>t2)lx=lmx,ly=lmy;
else rx=rmx,ry=rmy;
}
return get(ax,ay,x,y)/p+get(dx,dy,lmx,lmy)/q+get(x,y,lmx,lmy)/r;
}
int main()
{
//freopen("in.txt","r",stdin);
scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&ax,&ay,&bx,&by,&cx,&cy,&dx,&dy,&p,&q,&r);
double lx=ax,ly=ay,rx=bx,ry=by,lmx,lmy,rmx,rmy;
while(fabs(lx-rx)>eps||fabs(ly-ry)>eps)
{
lmx=lx+(rx-lx)/3;
lmy=ly+(ry-ly)/3;
rmx=rx-(rx-lx)/3;
rmy=ry-(ry-ly)/3;
if(cal(lmx,lmy)>cal(rmx,rmy))lx=lmx,ly=lmy;
else rx=rmx,ry=rmy;
}
printf("%.2f\n",cal(lmx,lmy));
return 0;
}
总结
三分套三分