题解 P1033 【自由落体】
震惊,我居然在信息里推物理式子
其实这一题出题人比较良心,没有卡精度,用double就能过。但这题坑点还是有的。
首先让我们来推式子。
对于任意一个小球,下落的时间是一样的,从公式
可得
因为这题很良心,把
因为球只要(居然不会被车头撞飞),所以小车可以接住小球的时间
然后我们就算这个时间段内小车穿过了多少个小球的
首先根据上面哪个公式可以得到
最早接住的球的编号
最晚接住的球的编号
这里的
然后我们就有代码了
#include<bits/stdc++.h>
using namespace std;
int n;
double h,s1,v,l,k;
int main()
{
cin>>h>>s1>>v>>l>>k>>n;
double t_max=sqrt(h/5);
double t_min=sqrt((h-k)/5);
int i_b=int(s1-t_min*v+l),i_e=int(s1-t_max*v);
cout<<i_b-i_e;
}
但是到这里就结束了吗?
我们可以发现这份代码连样例都过不了,因为存在一些特殊情况,如
或是
也就是我们把一些没有球的
就行了。
然后就是真正的
#include<bits/stdc++.h>
using namespace std;
int n;
double h,s1,v,l,k;
int main()
{
cin>>h>>s1>>v>>l>>k>>n;
double t_max=sqrt(h/5);
double t_min=sqrt((h-k)/5);
int i_b=int(s1-t_min*v+l),i_e=int(s1-t_max*v);
i_b=min(i_b,n);i_e=max(i_e,0);
cout<<i_b-i_e;
}