1 条题解

  • 0
    @ 2025-5-6 22:47:33

    题意 就是有很多个小球从高度为H的平面向地面做自由落体运动,每隔1秒钟掉下一个小球,如果小球在空中碰撞了,那么两个小球直接交换速度(包括大小和方向)。 一看这个题第一个反应就是蚂蚁走线的问题,这个题和蚂蚁走线有很多的相同之处,两个小球相撞可以看成两个小球直接从对方的身体中穿过去了,因为速度交换就可以看做速度没变。但是有一个问题就是小球有半径,两个球碰撞的地方并不是圆心,而是下面小球的上方,上面小球的下方,其实就多了一个2r,下面有一个小球就多一个2r,所以在最后计算结果的时候加一个2r×i就行了。一个小小的坑点就是r单位是cm,高度是m。剩下的就是考的高中的自由落体知识。

    #include <algorithm>
    #include <stdio.h>
    #include <math.h>
    
    using namespace std;
    const int maxn = 110;
    const double g = 10.0;
    
    double H[maxn];
    int n, h, r, t, c;
    
    void init() {
        scanf("%d%d%d%d", &n, &h, &r, &t);
    }
    
    double cal(double times) {
        if (times <= 0)
            return h;
        double T = sqrt(2.0 * (double) h / 10.0);
        int k = (int) (times / T);
        if (k & 1)//注意自由落体的计算公式
            return (double) h - g * ((double) k * T + T - times) * ((double) k * T + T - times) / 2.0;
        return (double) h - g * (times - (double) k * T) * (times - (double) k * T) / 2.0;
    }
    
    int main() {
        scanf("%d", &c);
        while (c--) {
            init();
            for (int i = 0; i < n; i++)
                H[i] = cal(t - i);
            sort(H,H+n);
            for (int i = 0; i < n; i++)
                printf("%.2f%c", H[i] + 2.0 * r * i / 100.0, i == n - 1 ? '\n' : ' ');
        }
        return 0;
    }
    • 1

    信息

    ID
    2685
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者