NC253077. 小沙的悬崖
描述
输入描述
四个正整数,用空格隔开。
输出描述
小沙一共飞行的路程长度。如果你的答案和标准答案的误差不超过,则认为你的答案正确。
示例1
输入:
1 1 1 1
输出:
1.35509738
说明:
C++(g++ 7.5.0) 解法, 执行用时: 91ms, 内存消耗: 472K, 提交时间: 2023-06-01 20:06:41
#include <bits/stdc++.h> using namespace std; using i64 = int64_t; using f64 = double; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); f64 s, v0, v1, g, ans = 0; cin >> s >> v0 >> v1 >> g; int step = 1000000; auto L = [&](f64 a) { return (2 * hypot(1, 2 * a) * a + asinh(2 * a)) / 4; }; for (int i = 0; i < step; i += 1) { f64 t = s / (v0 + v1); f64 v = (i & 1 ? v0 + v1 : v0); f64 a = g / 2 / v / v; ans += L(a * v * t) / a; s -= v1 * t; } cout << fixed << setprecision(20) << ans; }
C++(clang++ 11.0.1) 解法, 执行用时: 20ms, 内存消耗: 432K, 提交时间: 2023-06-02 10:37:25
#include<bits/stdc++.h> using namespace std; double s,v0,v1,g; double cal(double x) { return 1./2*x*sqrt(4*x*x+1)+1./4*asinh(2*x); } signed main() { cin>>s>>v0>>v1>>g; int t=100000; double ans=0; for(int i=1;i<=t;i++) { double t=s/(v0+v1); double v=(i&1)?v0:v0+v1; double a=g/(2.*v*v); ans+=cal(t*v*a)/a; s=s/(v0+v1)*v0; } cout<<fixed<<setprecision(20)<<ans<<endl; return 0; }
pypy3 解法, 执行用时: 82ms, 内存消耗: 21736K, 提交时间: 2023-06-02 10:16:31
import sys input = lambda: sys.stdin.readline().strip() s, v0, v1, g = map(float, input().split()) from math import sqrt, log res = cnt = 0 delta = 1e-7 while s >= delta: t = s/(v0+v1) v = v0 if cnt == 0 else v0+v1 u = g*t/v res += 0.5*v*v/g * (u * sqrt(1+u**2) + log(u+sqrt(1+u**2))) s -= v1*t cnt ^= 1 print(res)