题解:两个球相撞返回,首先如果忽视掉体积,看成质点,那么相撞返回就可以理解成两个求擦肩而过,互不影响,(就和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; }