考虑计算答案直到其足够精确。

对于一次跳跃,我们首先需要确定起跳的墙的相对速度 vv(对于一开始的墙,速度是 0+v00 + v_0,而另外一个墙就是 v1+v0v_1 + v_0)。然后考虑计算时间:t0=sv0+v1t_0 = \dfrac {s}{v_0 + v_1}。在知道时间后,可以写出抛物线的方程:

x=vty=12gt2\begin{aligned} x & = v t \\ y & = \dfrac 1 2 g t^2 \\ \end{aligned}

解出抛物线表达式:y=2gv2x2y = \dfrac {2}{gv^2} x^2,只需要求出其在 [0,vt0][0, vt_0] 内的距离就行了,这一个可以参考网络资料或者自行积分。

在最后计算新的 ss 即可。

// https://www.zhihu.com/question/308860676
 
double L_1 (double a) {
  return log(2 * a + sqrt(1 + 4 * a * a)) / 4 + a * sqrt(1 + 4 * a * a) / 2;
}
 
double L_k (double k, double a) {
  return L_1(a * k) / k;
}
 
double s, v0, v1, g;
 
int main() {
  cin >> s >> v0 >> v1 >> g;
  double ans = 0;
  bool bk = false;
  while (1) {
    double t = s / (v0 + v1);
    double v = v0 + (bk ? v1 : 0);
    double k = g / 2 / v / v;
    double p = L_k (k, v * t);
    s -= t * v1;
    ans += p;
    if (p <= 1e-6)
      break;
    bk ^= 1;
  }
  printf("%.10f", ans);
  return 0;
}