题目大意
二维平面上有两条线段,一条端点为A,B,另一条端点是C,D,在分别两条线段上和平面上都有不同的速度,求从A走到D花费的最短时间。
所有坐标为1~1000的整数
时间限制 1s
空间限制 256M
解题思路
三分套三分
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 10006
#define maxt 30006
#define fr(i,a,b) for(i=a;i<=b;i++)
using namespace std;
typedef long long ll;
const double eps=0.001;
double sqr(double x)
{
return x*x;
}
double dist(double x,double y,double w,double v)
{
return sqrt(sqr(x-w)+sqr(y-v));
}
int ax,ay,bx,by,cx,cy,dx,dy,p,q,rr;
double l,r,mid1,mid2,base1,base2,ans;
double make(double x,double y)
{
double l=0,r=base2,mid1,mid2,w,v,s1,s2,s=1 << 30;
while (r-l>eps)
{
mid1=l+(r-l)/3;
mid2=r-(r-l)/3;
w=cx+mid1/base2*(dx-cx),v=cy+mid1/base2*(dy-cy);
s1=dist(x,y,w,v)/rr+dist(w,v,dx,dy)/q;
w=cx+mid2/base2*(dx-cx),v=cy+mid2/base2*(dy-cy);
s2=dist(x,y,w,v)/rr+dist(w,v,dx,dy)/q;
s=min(s1,s2);
if (s1<s2) r=mid2; else l=mid1;
}
return s;
}
int main()
{
scanf("%d%d%d%d",&ax,&ay,&bx,&by);
scanf("%d%d%d%d",&cx,&cy,&dx,&dy);
scanf("%d%d%d",&p,&q,&rr);
base1=dist(ax,ay,bx,by);
base2=dist(cx,cy,dx,by);
l=0,r=base1;
while (r-l>eps)
{
mid1=l+(r-l)/3;
mid2=r-(r-l)/3;
double x,y,s1,s2;
x=ax+mid1/base1*(bx-ax),y=ay+mid1/base1*(by-ay);
s1=make(x,y)+dist(ax,ay,x,y)/p;
x=ax+mid2/base1*(bx-ax),y=ay+mid2/base1*(by-ay);
s2=make(x,y)+dist(ax,ay,x,y)/p;
ans=min(s1,s2);
if (s1>s2) l=mid1; else r=mid2;
}
printf("%.2f\n",ans);
return 0;
}