Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <vector>
- #include <iostream>
- #include <stdlib.h>
- #include <string>
- #include <string.h>
- #include <set>
- #include <algorithm>
- #include <math.h>
- #define EPS 1e-10
- using namespace std;
- double solve(double t, int tr, int tg)
- {
- int t1 = (int) (t + EPS);
- int k = t1 / (tr + tg);
- int tmin = k * (tr + tg) + tr;
- int tmax = (k + 1) * (tr + tg);
- if (t > tmin - EPS && t < tmax + EPS) return t;
- if (t < tmin - tr + EPS) return tmin - tr;
- if (t < tmin - EPS) return tmin;
- return tmin + (tr + tg);
- }
- int main(void)
- {
- freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
- double l, vmin, vmax, amin, amax;
- double s;
- int tr, tg;
- cin >> l >> vmin >> vmax >> amin >> amax;
- cin >> s >> tr >> tg;
- double ts = sqrt(2 * s / amax);
- double tvmax = vmax / amax;
- double tans, vans;
- if (tvmax < ts)
- {
- tans = tvmax;
- s -= tvmax * tvmax * amax / 2;
- tans += s / vmax;
- vans = vmax;
- tans = solve(tans, tr, tg);
- }
- else
- {
- ts = solve(ts, tr, tg);
- double tvmin = vmin / amin;
- double triptvmin = tvmin * (vmin) / 2;
- double ll = 0, rr = ts;
- for (int i = 0; i < 1000; i++)
- {
- double tt = (rr + ll) / 2;
- double xcur, vcur;
- if (tt > tvmin)
- {
- vcur = vmin;
- xcur = triptvmin + vmin * (tt - tvmin);
- }
- else
- {
- xcur = amin * tt * tt / 2;
- vcur = amin * tt;
- }
- double tost = ts - tt;
- double ss = s - xcur;
- double tss;
- if ((-vcur - sqrt(2*amax*s + vcur*vcur))/amax >= 0) tss = (-vcur - sqrt(2*amax*s + vcur*vcur))/amax; else
- tss = (-vcur + sqrt(2*amax*s + vcur*vcur))/amax;
- double tvmaxss = (vmax - vcur) / amax;
- double tres;
- if (tvmaxss < tss)
- {
- tres = tvmaxss;
- tres += (ss - tvmaxss * (vmax + vcur) / 2) / vmax;
- }
- else
- {
- tres = tss;
- }
- if (tres + tt < ts) ll = tt; else rr = tt;
- }
- {
- double tt = (rr + ll) / 2;
- double xcur, vcur;
- if (tt > tvmin)
- {
- vcur = vmin;
- xcur = triptvmin + vmin * (tt - tvmin);
- }
- else
- {
- xcur = amin * tt * tt / 2;
- vcur = amin * tt;
- }
- double tost = ts - tt;
- tans = ts;
- vans = vcur + amax * tost;
- }
- }
- tvmax = (vmax - vans) / amax;
- l-= s;
- if ((-vans - sqrt(2 * amax * l + vans*vans))/amax >= 0) ts = (-vans - sqrt(2 * amax * l + vans*vans))/amax ; else
- ts = (-vans + sqrt(2 * amax * l + vans*vans))/amax;
- if (tvmax < ts)
- {
- tans += tvmax;
- l -= tvmax * (vmax + vans) / 2;
- tans += l / vmax;
- }
- else
- {
- tans += ts;
- }
- printf("%.10lf", tans);
- return 0;
- }
Add Comment
Please, Sign In to add comment