题目反思 5(自由落体运动)

先看题目:

此题用不了多少程序的东西,主要是高中物理。

小球落地后才算是不能被接受,那么,被接受的条件是:小球下落的高度在区间 [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是任意的。

像极了高中物理中对临界情况的分析!

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值