说真的一开始没看懂这个题原因在于第一组数据太特殊了~唉还是英语水平白瞎
题意多看了几遍加上各种翻译懂了一开始一直感觉奇葩最短肯定是直线垂直。。。
后来想了懂了以后题目只要a到d并没有要求a到b到c到d。。这样就有很大问题了因为速度不一样
所以这需要有一个判定能不能走然后还要知道在那走
这样就要有两个求解的过程需要用二分或者三分
做完了一直是超时...后来没办法了把输入输出改成c的结果过了
代码:
#include
#include
#include
#include
using namespace std;
struct point
{
double x,y;
};
double dis(point a,point b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
double p,q,r;
double find2(point a,point c,point d)
{
point left,right;
point mid,midmid;
double t1,t2;
left=c;right=d;
do
{
mid.x=(left.x+right.x)/2;
mid.y=(left.y+right.y)/2;
midmid.x=(mid.x+right.x)/2;
midmid.y=(mid.y+right.y)/2;
t1=dis(a,mid)/r+dis(mid,d)/q;
t2=dis(a,midmid)/r+dis(midmid,d)/q;
if(t1>t2)left=mid;
else right=midmid;
}
while(dis(left,right)>=1e-5);
return t1;
}
double find(point a,point b,point c,point d)
{
point left,right;
point mid,midmid;
double t1,t2;
left=a;
right=b;
do
{
mid.x=(left.x+right.x)/2;
mid.y=(left.y+right.y)/2;
midmid.x=(mid.x+right.x)/2;
midmid.y=(mid.y+right.y)/2;
t1=dis(a,mid)/p+find2(mid,c,d);
t2=dis(a,midmid)/p+find2(midmid,c,d);
if(t1>t2)left=mid;
else right=midmid;
}while(dis(right,left)>=1e-5);
return t1;
}
int main()
{
int t;
point a,b,c,d;
scanf("%d",&t);
while(t--)
{
scanf("%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf%lf",&a.x,&a.y,&b.x,&b.y,&c.x,&c.y,&d.x,&d.y,&p,&q,&r);
printf("%.2lf\n",find(a,b,c,d));
}
return 0;
}