弹性碰撞

只有一个球时,这就是单纯的物理问题。

多个球时,所有的球都是一样的,两个球相撞后互相交换速度,可以视为直接互相穿过继续运动。

由于在碰撞时球的顺序是不会改变的,先落下的球始终在下面。 所以将计算出的每个球的高度进行排序就能知道每个球的最终位置。

最后按照R=0的结果加上2R*i就是每个球的高度。

#include<iostream>
#include<math.h>
#include<algorithm>
#include<stdio.h>
using namespace std;
int N,H,R,T;
const double g=10.0;
double y[105];
double calc(int T)
{
    if(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()
{
    int round;
    cin>>round;
    while(round--)
    {
        cin>>N>>H>>R>>T;
        for(int i=0; i<N; i++)
        {
            y[i]=calc(T-i);
        }
        sort(y,y+N);
        for(int i=0; i<N; i++)
        {
            printf("%.2f%c",y[i]+2*R*i/100.0,i+1==N?'
':' ');
        }
    }
    return 0;
}
poj3684
原文地址:https://www.cnblogs.com/wangkaipeng/p/6501917.html