chenxie95 / SJTU_C-_Cource

上交2022小学期 程序设计思想 答疑论坛
1 stars 0 forks source link

数组实训第23关小球碰撞 #5

Open Rick7117 opened 2 years ago

Rick7117 commented 2 years ago

代码在vscode中能够快速跑出,但是复制到网站上显示超时 屏幕截图 2022-07-03 223623 屏幕截图 2022-07-03 224012 代码在下面的压缩文件里 ballcoliision.zip

zbnlala commented 2 years ago

大家把这道题想的过于复杂,要去关注每一个小球的运动状态,复杂度太高了,我给大家提供一个通过的思路,大家思考一下。

这道题最容易让人迷惑的地方在于「我们认为小球的体积很小,碰撞满足动量守恒定律,且发生完全弹性碰撞,碰撞不发生能量损失,碰撞的时间非常短暂可以忽略」。按照常规思路,需要对每一个小球分别计算每个时刻所在的位置,如果考虑到改变移动方向,情况会非常复杂。

注意到题目要求的是第一个和最后一个小球从平台上掉下来的时刻,所以并不需要区分每一个小球。注意到题目中的信息,由于改变移动方向不花费额外时间,而且改变移动方向后的移动速度不变,因此,两个相遇的小球同时改变移动方向之后的情形等价于两个小球都不改变移动方向,继续按照原来的方向和速度移动,这样问题就简化成根据每一个小球的初始位置和移动方向得到第一个和最后一个小球掉出平台的时刻。

假设一个小球在位置 p。如果小球向左移动,则它掉出平台需要的时间是 p。如果这个小球向右移动,则它掉出平台需要的时间是 L-p。

遍历数组left 和right,根据每个小球的初始位置和移动方向得到每个小球掉出平台需要的时间,其中的最大值即为最后一个小球掉出平台的时刻,最小值即为第一个小球掉出平台的时刻。

代码和注释在下面,大家好好思考 ballcoliision.zip