How long must he take to travel from A to D?
For each case, there are three lines.
The first line, four integers, the coordinates of A and B: Ax Ay Bx By.
The second line , four integers, the coordinates of C and D:Cx Cy Dx Dy.
The third line, three integers, P Q R.
0<= Ax,Ay,Bx,By,Cx,Cy,Dx,Dy<=1000
1<=P,Q,R<=10
翻译//line belts传送带 segments部分 ab上速度p,其它地方速度r,有一个人需要从A到D
T 组测试数据
每一组数据,三行
第一行四个整数,A,B的坐标coordinates,ax,ay,bx,by
第二行,----
第三行,三个整数,p,q,r;
#include <bits/stdc++.h>
using namespace std;
double dist(double ax,double ay,double bx,double by)
{
return sqrt((ax-bx)*(ax-bx)+(ay-by)*(ay-by)+0.0000001);//定义求算距离的函数
}
double Ax,Ay,Bx,By,Cx,Cy,Dx,Dy;
double P,Q,R;
double AB,CD;
double ax;
double by;
double cal2(double mid)
{
double cx=(Dx-Cx)*(mid/CD)+Cx;
double dy=(Dy-Cy)*(mid/CD)+Cy;//计算分点坐标
double sum1=dist(ax,by,cx,dy);//距离
sum1=sum1/R;
sum1+=(CD-mid)/Q;
return sum1;//两部分时间
}
double cal(double Mid)
{
double sum=Mid/P;//时间
ax=(Bx-Ax)*(Mid/AB)+Ax;
by=(By-Ay)*(Mid/AB)+Ay;//坐标
CD=dist(Cx,Cy,Dx,Dy);//计算距离
double left=0.0,right=CD,mid,midmid,midv,midmidv;
while(fabs(right-left)>0.000000001)
{
mid=(right+left)/2.0;
midmid=(right+mid)/2.0;
midv=cal2(mid);
midmidv=cal2(midmid);//计算时间
if(midv<=midmidv)
{
right=midmid;
}
else left=mid;
}
return sum+cal2(left);//三分嵌套三分
}
int main()
{
int t;
cin>>t;
while(t--)
{
cin>>Ax>>Ay>>Bx>>By>>Cx>>Cy>>Dx>>Dy;
cin>>P>>Q>>R;
AB=dist(Ax,Ay,Bx,By);
double left=0.0,right=AB,mid,midmid,midv,midmidv;
while(fabs(right-left)>0.000000001)//对ab三分
{
mid=(right+left)/2.0;
midmid=(mid+right)/2.0;
midv=cal(mid);
midmidv=cal(midmid);
if(midv<=midmidv)
{
right=midmid;
}
else left=mid;
}
double s=cal(left);
printf("%.2lf\n",s);
}
return 0;
}