这道题,设AB上走到M处,CD上走到N处,然后得到AM===MN====ND的时间,先三分M,再三分D,至于为什么。。。
感受一下情况1假设AB走的M越远,到N就越短,然后就满足三分条件
2.AB走的越近到N越短的话,直接三分到A,就是不走AB。
最后CD上同理,于是就是三分套三分。
pqr的速度都不用考虑的,反正三分能求出最值。
#include<cstdio>
#include<cstring>
#include<cmath>
#define eps 1e-7
using namespace std;
//http://www.cnblogs.com/newpanderking/archive/2011/08/27/2155430.html
struct point
{
double x,y;
};
double p,q,v;
double dis(point a,point b)
{
return sqrt(pow((a.y-b.y),2)+pow(a.x-b.x,2));
}
double findy(point c,point d,point y)
{
point mid,midmid,left,right;
double t1,t2;
left = c;
right = d;
do
{
mid.x = (left.x+right.x)/2;
mid.y = (left.y+right.y)/2;
midmid.x = (right.x+mid.x)/2;
midmid.y = (right.y+mid.y)/2;
t1 = dis(d,mid)/q+dis(mid,y)/v;
t2 = dis(d,midmid)/q+dis(midmid,y)/v;
if(t1>t2)
left = mid;
else right = midmid;
}while(fabs(t1-t2)>0.000001);
return t1;
}
double find(point a,point b,point c,point d)
{
point mid,midmid,left,right;
double t1,t2;
left = a;
right = b;
do
{
mid.x = (left.x+right.x)/2;
mid.y = (left.y+right.y)/2;
midmid.x = (right.x+mid.x)/2;
midmid.y = (right.y+mid.y)/2;
t1 = dis(a,mid)/p+findy(c,d,mid);
t2 = dis(a,midmid)/p+findy(c,d,midmid);
if(t1>t2)left = mid;
else right = midmid;
}while(fabs(t1-t2)>0.000001);
return t1;
}
int main()
{
int t;
point a,b,c,d;
scanf("%d",&t);
for(int i=1;i<=t;i++)
{
scanf("%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y);
scanf("%lf%lf%lf%lf",&c.x,&c.y,&d.x,&d.y);
scanf("%lf%lf%lf",&p,&q,&v);
printf("%.2f\n",find(a,b,c,d));
}
return 0;
}