POJ 3684 Physics Experiment(弹性碰撞)

本文深入分析了在一个特定高度设置圆筒,将多个半径相同的球从不同高度释放,研究球体在自由落体过程中的运动规律。通过给出具体的数学模型和计算公式,详细解释了如何计算不同时间点各球底端距离地面的高度。着重讨论了球与球或地面碰撞的弹性效应,以及空气阻力对实验结果的影响忽略。同时,提供了编程实现的思路和代码示例,帮助读者理解和实践这一物理现象。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Description
用N个半径为R厘米的求进行如下实验
在H米高的位置设置了一个圆筒,将求竖直放入(从上到下第i个球的底端距离地面高度为H+2R)。实验开始时最下面的球开始掉落,此后每一秒又有一个球开始掉落。不计空气阻力,并假设球与球或地面间的碰撞是弹性碰撞
请求出实验开始后T秒钟时每个球底端的高度。假设重力加速度g=10m/s^2
Input
第一行为用例组数t,每组用例占一行包括四个整数N,H,R,T分别表示球的个数,圆筒底端距地面距离,球半径,查询时间T
Output
对于每组用例,输出T秒后这N个球底端距离地面距离
Sample Input
2
1 10 10 100
2 10 10 100
Sample Output
4.95
4.95 10.20
Solution
首先考虑一下只有一个球的情形,从高度的位置下落需要花费时间为这里写图片描述
这样的话,在时刻T内,令k为满足kt<=T的最大整数,那么这里写图片描述
接下来再考虑多个球的情形,与Ants类似,当把两球看作质点,即R=0时就可以无视它们的碰撞,视作直接互相穿过继续运动。由于在有碰撞时球到达顺序不会发生改变,所以无视碰撞,将计算得到的坐标进行排序后,就可以知道每个球的最终位置。而R>0时只需将下方开始的第i个球在按照R=0时计算的结果上加上2Ri就好了
Code

#include<cstdio>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
#define maxn 101
int M,N,H,R,T;
double g=10.0;
double y[maxn];//球的最终位置 
double solve(int T)//求出T时刻球的位置 
{
    if(T<0)//T<0说明该球还未从圆筒中下落 
        return H;
    double t=sqrt(2*H/g);
    int k=(int)(T/t);
    if(k%2==0)
    {
        double d=T-k*t;
        return H-g*d*d/2;
    }
    else
    {
        double d=k*t+t-T;
        return H-g*d*d/2;
    }
}
int main()
{
    scanf("%d",&M);
    while(M--)
    {
        scanf("%d%d%d%d",&N,&H,&R,&T);
        for(int i=0;i<N;i++)
            y[i]=solve(T-i);
        sort(y,y+N);//对坐标排序 
        for(int i=0;i<N;i++)
            printf("%.2lf%c",y[i]+2*R*i/100.0,i==N-1?'\n':' ');//按格式输出 
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值