http://poj.org/problem?id=3684
《挑战程序设计竞赛》P158
N个球叠放在一起,每隔一秒最下边的球
** 就掉落下来,给定最下面球的底的高度,求T秒后每个球的底的离地高度,g=10m/s^2.
碰撞时两个球的速度交换了,实际上可以看做两个球互相穿越了彼此,但
** 又由于球的顺序不会变,所以求得的结果排序后就是答案。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <queue>
#include <algorithm>
using namespace std;
const double g=10.0;
int C,N,H,R,T;
double y[105]; //求的最终位置
double F(int T){
if (T<0) return H;
double t=sqrt(2*H/g);
int k=(int)(T/t);
double d;
if (k&1){
d=k*t+t-T;
}
else{
d=T-k*t;
}
return H-g*d*d/2;
}
int main(){
cin >> C;
while (C--){
cin >> N >> H >> R >> T;
for (int i=0;i<N;i++){
y[i]=F(T-i);
}
sort(y,y+N);
for (int i=0;i<N;i++){
printf("%.2lf%c",y[i]+2*R*i/100.0,i+1==N?'\n':' ');
}
}
}