列表

详情


NC253077. 小沙的悬崖

描述

小沙被困在两个巨大的墙壁之中快要被压死了,但是两个墙壁中间就是万丈悬崖,小沙会不断的向对面墙壁跳。两个墙壁的初始距离为s。小沙的初始速度是v_0(相对于起跳墙壁),初始速度方向为水平,但由于重力的影响,小沙会有一个向下的加速度g,因此小沙的运动轨迹是抛物线。已知两个墙壁是以v_1的相对速度匀速相向运动。当小沙跳到对面墙壁时,他会立刻重新起跳,初始速度仍然是v_0(相对于起跳墙壁),方向仍然是水平。请问小沙在被压死的那一刻一共飞了多少米?
我们计算小沙路程时,以小沙第一次起跳的墙壁作为参考系!
注:小沙可以视为质点,即忽略体积。

输入描述

四个正整数s,v_0,v_1,g,用空格隔开。
1\leq s,v_0,v_1,g \leq 100

输出描述

小沙一共飞行的路程长度。如果你的答案和标准答案的误差不超过10^{-4},则认为你的答案正确。

示例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)

上一题