http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1175
题意:GG要尽快回到家,但是有两种选择,一种是恒以速度vr以直线跑到家,一种先跑到公路搭车(x轴)然后以vt的速度直线回家,问所需的最小时间。
思路:首先可以求出s1,表示GG跑回家所需的时间,但是如果乘车,显然要选一个最优点,并且选的点不同所需的时间也不同,显然是一条开口向上的抛物线,那么我们可以三分求出这个最优点。
#include<cstdio>
#include<cmath>
#include<algorithm>
#define E 1e-10//注意要取一个精度
using namespace std;
double x1,x2,y11,y2,vr,vt;
double solve(double x) //第二种方式,先跑步在乘车 总共需要的时间
{
return sqrt((x1-x)*(x1-x)+y11*y11)/vr+sqrt((x2-x)*(x2-x)+y2*y2)/vt;
}
double fun()
{
double low,high,mid,midd;
if(x1>x2) swap(x1,x2);
low=x1,high=x2;
while(low+E<high) //不能直接相等
{
mid=(low+high)/2;
midd=(mid+high)/2;
double v1=solve(mid);
double v2=solve(midd);
if(v1<=v2)
{
high=midd;
}
else low=mid;
}
return solve(low);
}
int main()
{
int t,i,j;
double s,s1;
scanf("%d",&t);
while(t--)
{
scanf("%lf%lf%lf%lf%lf%lf",&x1,&y11,&x2,&y2,&vr,&vt);
s=sqrt((x1-x2)*(x1-x2)+(y11-y2)*(y11-y2))/vr;
s1=fun();
printf("%.2lf\n",s<s1?s:s1);
}
return 0;
}