题目描述 https://www.luogu.org/problemnew/show/P2571
走的路程一定是AE到EF再到FD(其中E在AB上 F在CD上)
E F 都是未知量 需要两次三分 第一次三分确定E ,再此基础上三分找F。
**#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
const double eps=1e-6;
double ax,ay,bx,by,cx,cy,dx,dy,p,q,r;
double dis(double x1,double y1,double x2,double y2)
{
double disx=x1-x2,disy=y1-y2;
return sqrt(disx*disx+disy*disy);
}
double f(double ex,double ey,double fx,double fy)
{
return dis(ex,ey,fx,fy)/r+dis(fx,fy,dx,dy)/q;
}
double cal2(double x,double y)//E的坐标 内层三分F
{
double lx=cx,ly=cy,rx=dx,ry=dy;
while(dis(lx,ly,rx,ry)>eps)
{
double midx=(rx-lx)/3.0,midy=(ry-ly)/3.0;
double lmx=lx+midx,lmy=ly+midy,rmx=rx-midx,rmy=ry-midy;
double ansl=f(x,y,lmx,lmy),ansr=f(x,y,rmx,rmy);
if(ansr>ansl) rx=rmx,ry=rmy;
else lx=lmx,ly=lmy;
}
return f(x,y,lx,ly);
}
double cal1()//外层三分E
{
double lx=ax,ly=ay,rx=bx,ry=by;
while(dis(lx,ly,rx,ry)>eps)
{
double midx=(rx-lx)/3.0,midy=(ry-ly)/3.0;
double lmx=lx+midx,lmy=ly+midy,rmx=rx-midx,rmy=ry-midy;
double ansl=dis(ax,ay,lmx,lmy)/p+cal2(lmx,lmy);
double ansr=dis(ax,ay,rmx,rmy)/p+cal2(rmx,rmy);
if(ansr>ansl) rx=rmx,ry=rmy;
else lx=lmx,ly=lmy;
}
return dis(ax,ay,lx,ly)/p+cal2(lx,ly);
}
int main()
{
scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&ax,&ay,&bx,&by,&cx,&cy,&dx,&dy,&p,&q,&r);
printf("%.2lf",cal1());
return 0;
}**