#include using namespace std; using ll = long long; using ii = pair; using vi = vector; using vii = vector; using vvi = vector; #define ALL(x) (x).begin(),(x).end() #define ff first #define ss second #define D(a) //cerr << ">> " << #a << " = >" << a << "<" << endl #define PB push_back #define F(i,a,b) for ( int i = (int)(a); i < (int)(b); ++i ) #define FD(i,a,b) for ( int i = int(a); i >= int(b); --i ) #define R1(a) scanf("%d",&a) #define R2(a,b) scanf("%d%d",&a,&b) #define R3(a,b,c) scanf("%d%d%d",&a,&b,&c) #define DR1(a) int a; scanf("%d",&a) #define DR2(a,b) int a,b; scanf("%d%d",&a,&b) #define DR3(a,b,c) int a,b,c; scanf("%d%d%d",&a,&b,&c) const int INF = 1e9 + 7; constexpr const double PI = acos(-1); const double EPS = 1e-9; // reading input void R() { } template void R(T & x, Args & ... args) { cin >> x; R(args...); } int tf, vf, hf, td, vd, hd; const long double a = 3.0; const long double discA = 1; long double timeToReachMaxHeight; long double v0; long double findFallDownTime(long double hf) { long double lo = 0, hi = hf, mi; F(i,0,100) { mi = (hi + lo) / 2; if (0.5 * mi * mi > hf) hi = mi; else lo = mi; } return (lo + hi) / 2; } long double guessTimeToReachMaxHeight(long double hd) { long double lo = 0, hi = hd, mi; F(i,0,100) { mi = (hi + lo) / 2; if (mi * mi * 3 / 2.0 > hd) hi = mi; else lo = mi; } return (lo + hi) / 2; } bool binary(long double timeFrisbeeLands, long double v0, long double time) { D(time); D(tf); D(timeFrisbeeLands); long double discFlyTime = min( time, timeFrisbeeLands ) - tf; D(discFlyTime); long double discX = discFlyTime * vf; D(discX); long double discY = hf - 0.5 * discA * discFlyTime * discFlyTime; D(discY); // assert(discY >= -EPS); // assert(discX <= (timeFrisbeeLands - tf) * vf); // D(time); // D(discX); // D(discY); if (discY > hd) { D("discY > hd"); return false; } long double dogRunTime = time - td; long double dogXTime = discX / vd; D(dogRunTime); D(dogXTime); if (dogXTime > dogRunTime) { D("dogXTime > dogRunTime"); return false; } long double dogJumpTime = min( dogRunTime, timeToReachMaxHeight ); long double tx = (timeToReachMaxHeight - dogJumpTime); long double dogMaxY = hd - a / 2 * tx * tx; // long double dogMaxY = v0 * dogJumpTime - a / 2 * dogJumpTime * dogJumpTime; if (discY > dogMaxY) { D("discY > dogMaxY"); return false; } // abort(); return true; } int main( ) { ios::sync_with_stdio(0); cin >> tf >> vf >> hf >> td >> vd >> hd; timeToReachMaxHeight = sqrt(2 / 3.0 * hd); D(timeToReachMaxHeight); // D(sqrt(8*hd / a) / 2.0); // D(guessTimeToReachMaxHeight(hd)); // timeToReachMaxHeight = sqrt(8*hd / a) / 2.0; long double timeFrisbeeLands = tf + sqrt(2 * hf); assert(fabs(timeFrisbeeLands - (findFallDownTime(hf) + tf)) <= 1e-6); D(timeFrisbeeLands); long double lo = td, hi = max(timeFrisbeeLands, timeFrisbeeLands * vf / vd + td); D(lo); D(hi); long double v0 = a * timeToReachMaxHeight; D(v0); // abort(); F(i,0,200) { long double mi = (hi + lo) / 2; if (binary(timeFrisbeeLands, v0, mi)) { hi = mi; } else { lo = mi; } D(mi); } D(lo); D(hi); long double time = (hi + lo) / 2; D(time); long double discFlyTime = min( time, timeFrisbeeLands ) - tf; long double discX = discFlyTime * vf; D(discX); printf("%.8Lf\n", time + discX / vd); return 0; }