#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> #include <cmath> using namespace std; const double eps = 1e-7; double X1, Y1, X2, Y2, Vmax, t, Vx1, Vy1, Vy2, Vx2; bool check(double mid) { double X = X2, Y = Y2, D = Vmax * mid; if (mid >= t) { X -= Vx2 * (mid - t) + Vx1 * t; Y -= Vy2 * (mid - t) + Vy1 * t; } else { X -= Vx1 * mid; Y -= Vy1 * mid; } if ((X - X1) * (X - X1) + (Y - Y1) * (Y - Y1) <= D * D) return true; else return false; } int main(int argc, char const *argv[]) { while (~scanf("%lf%lf%lf%lf", &X1, &Y1, &X2, &Y2)) { scanf("%lf%lf", &Vmax, &t); scanf("%lf%lf%lf%lf", &Vx1, &Vy1, &Vx2, &Vy2); double l = 0, r = 1e9, mid = (l + r) / 2; while (r - l >= eps) { if (check(mid)) r = mid; else l = mid; mid = (l + r) / 2; } printf("%.7lf\n", r); } return 0; }
最大的难度在于英语。。。。。。
从A点坐飞船到B点,飞船相对空气飞行的最大速度为vmax,速度大小方向可以随时改变.天气预报说今天有大风,t时刻前风向及大小用向量(ux,uy)表示,而t时刻之后转变为(vx,vy).当飞船相对空气静止时,在风(wx,wy)作用下将以(wx,wy)的速度运动.也就是说,实际速度向量是飞船速度向量和风速合成的结果. 问,至少需要多少时间才能从A点到达B点.
已知时间大于Vmax时,必然到达。那么显然就是二分或者三分。
恩,需要一些物理上的小技巧,把相对地面坐标系换成相对风,这样就简单多了。
确定B点在反向风力下运动t′时间(注意风向在t时刻改变)后的位置,而这段时间内飞船能到达的位置与飞船距离不超过t′∗vmax,也就是说只要判断运动t′时间后的B点到飞船的距离是否不超过t′∗vmax即可确定飞船能否在t′时间内从A点出发到达B点.