点击跟博主一起玩(zuo)耍(si)
这道题第一眼看上去挺唬人的。什么0.0001,什么自由落体什么速度V前进的,第一反应就是数学题然后运用动归(前后走)来进行解决。
但是仔细看看题目和数据范围,你会发现这就是个模拟。
首先预处理小球掉落时间和小车到达时间。若0<=x<=0.0001时,小车能接到球反之不行。因为小车速度不变我们只需要预处理小球掉落时间+模拟小车走动就可以在O(n)的时间内解决问题而不需要进行动态规划。
代码
#include <iostream>
#include <cmath>
#include <algorithm>
const int ebs= 1e-5;
using namespace std;
double h, n, k, l, s1, v, p1, p2, t1, t2;
int ans;
int main()
{
cin>>h>>s1>>v>>l>>k>>n;
p1 = s1, p2 = s1+l;
t1 = sqrt(2*(h-k)/10);
t2 = sqrt(2*h/10);
if (t1 >= 0) p2 -= (v*t1);
p1 -= (v*t2);
if (!(p2 < 0 && fabs(p2) > ebs) && !(p1 > n-1 && fabs(p1-n+1) > ebs))
{
if (p1-floor(p1) <= ebs) p1 = floor(p1);
if (ceil(p2)-p2 <= ebs) p2 = ceil(p2);
if (p1 < 0) p1 = 0;
if (p2 > n-1) p2 = n-1;
ans = floor(p2) - ceil(p1) + 1;
}
cout << ans;
return 0;
}