1 solutions

  • 0
    @ 2021-10-24 20:54:11

    P1123. 飞行执照 题解

    题意概述

    带着风之翼滑行,风之翼会提供升力,荧视为质点处理。以一定的初速度,于原点飞出去。

    飞行通过半径为 1 光圈即算。最后通过光圈数占总光圈数60%及以上输出Yes否则输出No。

    题意分析

    不难看出,这是一个平抛运动:

    1. 有初速度
    2. 中间过程受力恒定(忘了写忽略空气阻力,抱歉)

    平抛运动就要考虑速度分解(刚读完高中的你们比我厉害吧 /狗头)。我们建立一个坐标系,以出发点为原点,速度方向为 x 轴正方向,下落方向为 y 轴正方向。

    对速度做分解,用 x 计算下落总时长,并且利用这个时长通过时间位移公式得出下落高度,下落高度与光圈中心位置的差值小于等于 1 即可通过该光圈。

    这个题还有些细节问题,欢迎私聊我讨论

    可行代码

    #include <math.h>
    #include <stdio.h>
    int M = 45;                 // 体重
    double g = 9.8;             // 重力加速度
    int r = 1;                  // 光圈半径
    int F = 300;                // 升力
    double a = (M * g - F) / M; // 最终合力的加速度
    int main() {
        int T;
        scanf("%d", &T);
        while (T--) {
            int v0, m;// 初速度,光圈数
            scanf("%d%d", &v0, &m);
            int pointx[m], pointy[m];
            for (int i = 0; i < m; i++) {
                scanf("%d%d", &pointx[i], &pointy[i]);
            }
            int cnt = 0;
            for (int i = 0; i < m; i++) {
                double t = pointx[i] * 1.0 / v0;
                double h = (1 / 2.0) * a * t * t;
                if (fabs(h - pointy[i]) <= r)
                    cnt++;
            }
            if (cnt * 1.0 / m >= 0.6)
                printf("Yes\n");
            else
                printf("No\n");
        }
        return 0;
    }
    

    END 最后,欢迎所有通过选拔的同学来到ACM,也祝愿别的同学在编程这条路上持之以恒,加油,希望未来赛场上能够再见到你们!

    Information

    ID
    138
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    9
    Tags
    # Submissions
    134
    Accepted
    14
    Uploaded By