先看题目:

此题用不了多少程序的东西,主要是高中物理。
小球落地后才算是不能被接受,那么,被接受的条件是:小球下落的高度在区间 [H-K,H] 之内。
根据自由落体的公式d=0.5g*t*t=5t^2,可以得到下落的时间范围为[sqrt((H-K)/5),sqrt(H/5)].又因为要被小车接受,所以需要算出小车在这两个临界时间内的位移,进而得到第一个被接受的球的编号和最后一个被接受的球的编号,最后再作差即可。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
double h,s,v,l,k,n;
cin>>h>>s>>v>>l>>k>>n;
int first=int((s-v*(double)sqrt((h-k)/5)+l));
int last=int((s-v*(double)sqrt(h/5)));
cout<<(first>n?n:first)-(last<0?0:last);
return 0;
}
这里需要说明两点:
1.为什么7、8两行要先在里面放一个double再在外面放一个int?
用double,是为了保证准确性,毕竟我们知道在c++里面,3/2=1
用int,则是因为球的序号是整数。举个例子:如果不对first 取int,假设算出来是7.5,也就是说,经历了sqrt((H-K)/5)后,小车的末端距离原点的位置为7.5,那么这时候只有编号为7的球可以被接受,因为编号大于等于8的球的下降高度还不足H-K.所以这时候要取7,因此需要用int
那读者可能会有这样的疑问,对于second呢?如果second 算出来是1.6,那么只有编号为2的球可以被接受,取int的话就变成了1,这是怎么回事?
实际上,是因为做减法的时候,如果算上被减数(减数),就不会算上减数(被减数)。比如说,7-5=2,可以说是因为5,6是两个整数,也可以说6,7是两个整数.既然作为被减数的first已经向下取了,也就意味着我们算上了被减数,那么久不能算上减数。也就是说,如果first算出来的是7.5,second算出来的是1.6,那么编号为2,3,4,5,6,7这6个球都可以被接受,根据减数和被减数不能同时被算入的原则,second也要取int,才能保证first-second是被接受的球的个数。
2.倒数第三行中 (first>n?n:first)的意思是:
first大于n吗?如果是,就输出n,如果不是,就输出first。相当于一个if-else语句。后面的那个last也是一样的道理。
这么做的理由是,在计算中,first是有可能小于n的。这种情况是:H很小,小到小车刚刚走了一点点,所有球都落地了。Last是有可能小于0的,这种情况是:H很大,大到小车都过了原点了,小球下落的高度还没有到达H-K.因此,对于这两种特殊情况,也要考虑进去,因为H是任意的。
像极了高中物理中对临界情况的分析!
235

被折叠的 条评论
为什么被折叠?



