题意:给定A,B,C,D四点坐标,以及由A到B,由C到D,其余路程的速度P,Q,R.,求出飞机从A到D的最小时间。
思路:先求出各点之间的距离,每段路程除以相应时间,用三分法求出在那个点转向所用时间最短。
感悟:这道题主要是判断在哪的地方转向,思路好想,代码写起来麻烦。
AC代码:
#include<iostream>
#include<iomanip>
#include<cmath>
using namespace std;
struct point
{
double x,y;
}a,b,c,d;
double v1,v2,v3;
double f (point a,point b)
{
return sqrt ((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y));
}
point mp (point a,point b)
{
point m;
m.x=(a.x+b.x)/2;
m.y=(a.y+b.y)/2;
return m;
}
double sf1(point m)
{
point mid,mm,l,r;
l=c;
r=d;
double t1=0,t2=100;
while (fabs(t2-t1)>0.000001)
{
mid=mp(l,r);
mm=mp(mid,r);
t1=f(m,mid)/v3+f(mid,d)/v2;
t2=f(m,mm)/v3+f(mm,d)/v2;
if (t1>t2)
l=mid;
else
r=mm;
}
return t1;
}
double sf ()
{
point mid,mm,l,r;
l=a;
r=b;
double t1=0,t2=100;
while (fabs(t2-t1)>0.000001)
{
mid=mp(l,r);
mm=mp(mid,r);
t1=f(mid,a)/v1+sf1(mid);
t2=f(mm,a)/v1+sf1(mm);
if (t1>t2)
l=mid;
else
r=mm;
}
return t1;
}
int main()
{
int T;
cin>>T;
while (T--)
{
cin>>a.x>>a.y>>b.x>>b.y>>c.x>>c.y>>d.x>>d.y>>v1>>v2>>v3;
cout<<fixed<<setprecision(2)<<sf()<<endl;
}
return 0;
}