传送门
解析:
显然,当我们在 A B AB AB上确认一个点后,在 C D CD CD上选择一个点对最终时间的影响是单峰的,考虑三分。
而每次选择 A B AB AB上的点对时间的影响也是单峰的。
那么我们就考虑三分套三分吧。。
为了使板子以外的代码尽量简洁,封装了一个 V e c t o r Vector Vector向量(计算几何的习惯写法)
代码:
#include<bits/stdc++.h>
using namespace std;
#define re register
#define ll long long
#define gc getchar
#define pc putchar
#define cs const
#define st static
inline
int getint(){
re int num=0;
re char c=gc();
for(;!isdigit(c);c=gc());
for(;isdigit(c);c=gc())num=(num<<1)+(num<<3)+(c^48);
return num;
}
inline
double getdb(){
re double x=0,y=1.0;
re char c=0;
re bool f=1;
for(;!isdigit(c);c=gc())if(c=='-')f=0;
for(;isdigit(c);c=gc())x=x*10+(c^48);
if(c!='.')return f?x:-x;
for(c=gc();isdigit(c);c=gc())x+=(y/=10)*(c^48);
return f?x:-x;
}
struct Vector{
double x,y;
Vector(cs double &_a=0.0,cs double &_b=0.0):x(_a),y(_b){}
Vector operator=(cs Vector &b){
x=b.x,y=b.y;
return *this;
}
Vector operator*(cs double &b)cs{
return Vector(x*b,y*b);
}
Vector operator-(cs Vector &b)cs{
return Vector(x-b.x,y-b.y);
}
Vector operator+(cs Vector &b)cs{
return Vector(x+b.x,y+b.y);
}
Vector operator/(cs double &b)cs{
return Vector(x/b,y/b);
}
};
inline
double dis(cs Vector &a,cs Vector &b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
Vector a,b,c,d;
double p,q,r;
inline
double F2(Vector x1,Vector x2){
return dis(a,x1)/p+dis(x1,x2)/r+dis(x2,d)/q;
}
inline
double F1(Vector x){
Vector l=c,r=d;
while(dis(l,r)>=1e-6){
Vector midl=l+(r-l)/3.0;
Vector midr=l+(r-l)*2.0/3.0;
if(F2(x,midl)<F2(x,midr))r=midr;
else l=midl;
}
return F2(x,l);
}
signed main(){
a.x=getint();
a.y=getint();
b.x=getint();
b.y=getint();
c.x=getint();
c.y=getint();
d.x=getint();
d.y=getint();
p=getint();
q=getint();
r=getint();
Vector l=a,r=b;
while(dis(l,r)>=1e-6){
Vector midl=l+(r-l)/3.0;
Vector midr=l+(r-l)*2.0/3.0;
if(F1(midl)>F1(midr))l=midl;
else r=midr;
}
printf("%.2lf",F1(l));
return 0;
}