传送门
我们三分两个转折点。
显然在第一个点确定时时间关于第二个点坐标的函数是单峰函数
同时最优时间关于第一个点的坐标的函数也是单峰函数
大力三分套三分不虚。
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const double eps=1e-10;
struct node{
double x,y;
void read(){scanf("%lf%lf",&x,&y);}
}a,b,c,d,l,r,m1,m2,ll,rr,mm1,mm2;
double P,Q,R,f1,f2;
double dis(node a,node b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
void getpoint(node a,node b,node &c,node &d){
c.x=(2*a.x+b.x)/3; c.y=(2*a.y+b.y)/3;
d.x=(a.x+b.x*2)/3; d.y=(a.y+b.y*2)/3;
}
double calc(node m1){
ll=c;rr=d;
while (dis(ll,rr)>eps){
getpoint(ll,rr,mm1,mm2);
f1=dis(m1,mm1)/R+dis(mm1,d)/Q;
f2=dis(m1,mm2)/R+dis(mm2,d)/Q;
if (f1<f2) rr=mm2; else ll=mm1;
}
return dis(a,m1)/P+dis(m1,ll)/R+dis(ll,d)/Q;
}
int main(){
a.read(); b.read(); c.read(); d.read();
scanf("%lf%lf%lf",&P,&Q,&R);
l=a,r=b;
while (dis(l,r)>eps){
getpoint(l,r,m1,m2);
if (calc(m1)<calc(m2)) r=m2; else l=m1;
}
printf("%.2lf",calc(l));
}