fork download
  1. #include <cstdio>
  2. #include <cmath>
  3. #include <utility>
  4. using namespace std;
  5. typedef long long ll;
  6.  
  7. double xs, ys, xf, yf, phi, v0, v1;
  8. double lo, hi, m1, m2, t1, t2;
  9. const double EPS = 1e-9;
  10.  
  11. double ed(double a, double b) {
  12. return sqrt(a * a + b * b);
  13. }
  14.  
  15. double time(double a, double b) {
  16. pair<double, double> x = {0.0, a}, y = {sin(phi) * b, cos(phi) * b};
  17. double res = ed(xs - x.first, ys - x.second) / v0
  18. + ed(x.first - y.first, x.second - y.second) / v1
  19. + ed(xf - y.first, yf - y.second) / v0;
  20. return res;
  21. }
  22.  
  23. double get(double x) {
  24. double l = 0, r = ed(xs, ys) + ed(xf, yf);
  25. while (r - l > EPS) {
  26. double m1_ = l + (r - l) / 3, m2_ = r - (r - l) / 3;
  27. double t1_ = time(x, m1_), t2_ = time(x, m2_);
  28. if (t1_ < t2_) r = m2_;
  29. else l = m1_;
  30. }
  31. return time(x, l);
  32. }
  33.  
  34. int main() {
  35. scanf("%lf%lf%lf%lf%lf%lf%lf", &xs, &ys, &xf, &yf, &phi, &v0, &v1);
  36. lo = 0.0, hi = ed(xs, ys) + ed(xf, yf);
  37. while (hi - lo > EPS) {
  38. m1 = lo + (hi - lo) / 3, m2 = hi - (hi - lo) / 3;
  39. t1 = get(m1), t2 = get(m2);
  40. if (t1 < t2) hi = m2;
  41. else lo = m1;
  42. }
  43. printf("%.3lf\n", get(lo));
  44. return 0;
  45. }
  46.  
Success #stdin #stdout 0.01s 5280KB
stdin
Standard input is empty
stdout
-nan