题解:两个球相撞返回,首先如果忽视掉体积,看成质点,那么相撞返回就可以理解成两个求擦肩而过,互不影响,(就和poj1852蚂蚁的思想是一样的),这样想就相当于把题目简化了。然后又由于题目的真实情况,先掉落的球一定是所有球中最下面的一个,所以对最后求得的数据进行排序即可。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
const double g = 10.0;
int n, h, r, T;
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;
}
}
void solve() {
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 ? '
' : ' ');
}
}
int main() {
int p;
scanf("%d", &p);
while(p--) {
scanf("%d%d%d%d", &n, &h, &r, &T);
solve();
}
return 0;
}