考虑计算答案直到其足够精确。
对于一次跳跃,我们首先需要确定起跳的墙的相对速度 (对于一开始的墙,速度是 ,而另外一个墙就是 )。然后考虑计算时间:。在知道时间后,可以写出抛物线的方程:
解出抛物线表达式:,只需要求出其在 内的距离就行了,这一个可以参考网络资料或者自行积分。
在最后计算新的 即可。
// 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;
}