poj3684(弹性碰撞模型)

题解:两个球相撞返回,首先如果忽视掉体积,看成质点,那么相撞返回就可以理解成两个求擦肩而过,互不影响,(就和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 ? '\n' : ' ');
    }
}
int main() {
    int p;
    scanf("%d", &p);
    while(p--) {
        scanf("%d%d%d%d", &n, &h, &r, &T);
        solve();
    }
    return 0;
}

  

posted @ 2020-05-08 12:41  ジャスミン  阅读(246)  评论(0编辑  收藏  举报