三分法套三分法。
#include<bits/stdc++.h> #define eps 1e-3 #define dinf 1000000000 using namespace std; double ax,ay,bx,by,cx,cy,dx,dy,va,vb,vc,k1,b1,k2,b2,len1,len2,rev1=1,rev2=1; inline double F(double x,double k,double b){ if(k==dinf)return b; return k*x+b; } inline double dis(double x1,double y1,double x2,double y2){ return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } inline double Dist(double l1,double l2){ double x1,x2,y1,y2; if(k1==dinf)x1=ax,y1=ay+rev1*l1;else x1=ax+rev1*l1/sqrt(k1*k1+1),y1=F(x1,k1,b1); if(k2==dinf)x2=cx,y2=cy+rev2*l2;else x2=cx+rev2*l2/sqrt(k2*k2+1),y2=F(x2,k2,b2); return dis(x1,y1,x2,y2); } inline double dist(double l1,double l2){ return Dist(l1,l2)/vc+(len2-l2)/vb; } inline double calc(double l){ double L=0,R=len2; while(fabs(R-L)>eps){ double d=(R-L)/3,m1=L+d,m2=R-d; if(dist(l,m1)<dist(l,m2))R=m2; else L=m1; } return dist(l,L); } inline double solve(){ double l=0,r=len1; while(fabs(r-l)>eps){ double d=(r-l)/3,m1=l+d,m2=r-d; if(calc(m1)+m1/va<calc(m2)+m2/va)r=m2; else l=m1; } return calc(l)+l/va; } int main(){ scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&ax,&ay,&bx,&by,&cx,&cy,&dx,&dy,&va,&vb,&vc); k1=(bx-ax==0)?dinf:(by-ay)/(bx-ax);b1=ay-k1*ax; k2=(dx-cx==0)?dinf:(dy-cy)/(dx-cx);b2=cy-k2*cx; if(k1<0||(k1==0&&bx<ax)||(k1==dinf&&by<ay))rev1=-1; if(k2<0||(k2==0&&dx<cx)||(k2==dinf&&dy<cy))rev2=-1; len1=dis(ax,ay,bx,by);len2=dis(cx,cy,dx,dy); printf("%.2lf",solve()); return 0; }