Guest User

Untitled

a guest
Jun 24th, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.62 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <vector>
  3. #include <iostream>
  4. #include <stdlib.h>
  5. #include <string>
  6. #include <string.h>
  7. #include <set>
  8. #include <algorithm>
  9. #include <math.h>
  10.  
  11. #define EPS 1e-10
  12. using namespace std;
  13.  
  14. double solve(double t, int tr, int tg)
  15. {
  16.     int t1 = (int) (t + EPS);
  17.     int k = t1 / (tr + tg);
  18.     int tmin = k * (tr + tg) + tr;
  19.     int tmax = (k + 1) * (tr + tg);
  20.     if (t > tmin - EPS && t < tmax + EPS) return t;
  21.     if (t < tmin - tr + EPS) return tmin - tr;
  22.     if (t < tmin - EPS) return tmin;
  23.     return tmin + (tr + tg);
  24. }
  25.  
  26. int main(void)
  27. {
  28.     freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
  29.  
  30.     double l, vmin, vmax, amin, amax;
  31.     double s;
  32.     int tr, tg;
  33.  
  34.     cin >> l >> vmin >> vmax >> amin >> amax;
  35.     cin >> s >> tr >> tg;
  36.  
  37.     double ts = sqrt(2 * s / amax);
  38.     double tvmax = vmax / amax;
  39.  
  40.     double tans, vans;
  41.     if (tvmax < ts)
  42.     {
  43.         tans = tvmax;
  44.         s -= tvmax * tvmax * amax / 2;
  45.         tans += s / vmax;
  46.         vans = vmax;
  47.         tans = solve(tans, tr, tg);
  48.     }
  49.     else
  50.     {
  51.         ts = solve(ts, tr, tg);
  52.  
  53.         double tvmin = vmin / amin;
  54.         double triptvmin = tvmin * (vmin) / 2;
  55.         double ll = 0, rr = ts;
  56.         for (int i = 0; i < 1000; i++)
  57.         {
  58.             double tt = (rr + ll) / 2;
  59.             double xcur, vcur;
  60.             if (tt > tvmin)
  61.             {
  62.                 vcur = vmin;
  63.                 xcur = triptvmin + vmin * (tt - tvmin);
  64.             }
  65.             else
  66.             {
  67.                 xcur = amin * tt * tt / 2;
  68.                 vcur = amin * tt;
  69.             }
  70.  
  71.             double tost = ts - tt;
  72.             double ss = s - xcur;
  73.             double tss;
  74.             if ((-vcur - sqrt(2*amax*s + vcur*vcur))/amax >= 0) tss = (-vcur - sqrt(2*amax*s + vcur*vcur))/amax; else
  75.                 tss = (-vcur + sqrt(2*amax*s + vcur*vcur))/amax;
  76.             double tvmaxss = (vmax - vcur) / amax;
  77.  
  78.             double tres;
  79.             if (tvmaxss < tss)
  80.             {
  81.                 tres = tvmaxss;
  82.                 tres += (ss - tvmaxss * (vmax + vcur) / 2) / vmax;
  83.             }
  84.             else
  85.             {
  86.                 tres = tss;
  87.             }
  88.  
  89.             if (tres + tt < ts) ll = tt; else rr = tt;
  90.         }
  91.  
  92.  
  93.         {
  94.             double tt = (rr + ll) / 2;
  95.             double xcur, vcur;
  96.             if (tt > tvmin)
  97.             {
  98.                 vcur = vmin;
  99.                 xcur = triptvmin + vmin * (tt - tvmin);
  100.             }
  101.             else
  102.             {
  103.                 xcur = amin * tt * tt / 2;
  104.                 vcur = amin * tt;
  105.             }
  106.  
  107.             double tost = ts - tt;
  108.             tans = ts;
  109.             vans = vcur + amax * tost;
  110.         }
  111.     }
  112.  
  113.     tvmax = (vmax - vans) / amax;
  114.     l-= s;
  115.     if ((-vans - sqrt(2 * amax * l + vans*vans))/amax >= 0) ts = (-vans - sqrt(2 * amax * l + vans*vans))/amax ; else
  116.     ts = (-vans + sqrt(2 * amax * l + vans*vans))/amax;
  117.     if (tvmax < ts)
  118.     {
  119.         tans += tvmax;
  120.         l -= tvmax * (vmax + vans) / 2;
  121.         tans += l / vmax;
  122.     }
  123.     else
  124.     {
  125.         tans += ts;
  126.     }
  127.  
  128.     printf("%.10lf", tans);
  129.     return 0;
  130. }
Add Comment
Please, Sign In to add comment