T3のO(1)做法

RT


先看图

看明白这张图,就明白一半了,接下来开始推柿子。

我们还知道,$d=0.5gt^2$,$d$是小球落下的距离。

$g=10$,那么$d=5t^2$,那么$\dfrac d5=t^2$,那么$\sqrt{\dfrac d5}=t$。

如果要接到球,上图中$d$的范围就是$h-k≤d≤h$了(两条黑线)。

那么$\dfrac{h-k}5≤\dfrac d5≤\dfrac h5$,那么$\sqrt{\dfrac{h-k}5}≤\sqrt{\dfrac d5}≤\sqrt{\dfrac h5}$。

所以如果在$x$的时间能接到球,那么$\sqrt{\dfrac{h-k}5}≤x≤\sqrt{\dfrac h5}$。

接下来,就要算出小车在这段时间内覆盖到的长度了。

为了方便,接下来 $maxt=\sqrt{\dfrac h5},mint=\sqrt{\dfrac{h-k}5}$

这里可以看出区间为$s1-v×maxt$到$s1-v×mint+l$,下文记为$begin$到$end$。

但如果直接相减,你会发现连样例都过不去。

因为左右端点可能超过$[0,n]$的范围,即接了不存在的球。

所以$begin=max(begin,0),end=min(end,n)$。

现在相减就可以啦~

#include <iostream>
#include <cmath>
using namespace std;
double h, s, v, l, k, n;
int main()
{
    cin >> h >> s >> v >> l >> k >> n;
    double maxt = sqrt(h / 5), mint = sqrt((h - k) / 5);
    int begin = s - v * maxt, end = s - v * mint + l;
    if(begin < 0) begin = 0;
    if(end > n) end = n;
    cout << end - begin;
    return 0;
}
posted @ 2021-08-12 18:46  5k_sync_closer  阅读(2)  评论(0编辑  收藏  举报  来源