只有一个球时,这就是单纯的物理问题。
多个球时,所有的球都是一样的,两个球相撞后互相交换速度,可以视为直接互相穿过继续运动。
由于在碰撞时球的顺序是不会改变的,先落下的球始终在下面。 所以将计算出的每个球的高度进行排序就能知道每个球的最终位置。
最后按照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?'\n':' ');}}return 0; }