1 solutions

  • 0
    @ 2021-10-23 17:30:02

    P1130. 保卫蒙德 题解

    题意分析

    这就是一个阅读理解题,提取出关键信息,并结合题干给出的图片还是比较好理解。

    大致梳理一下:

    线索一

    “我的箭比较特殊,有元素力加持,可以在较长一段距离内保持直线飞行,当然元素力也会减弱,那时就会往下掉了。”
    “现在我赐予你一把风神之弓,里面含有风的力量,可以大幅增强你的元素力量,让箭飞得更远威力更大,我会尽量让你保持在特瓦林后面,你可以通过风之翼上下调整位置,尽力瞄准朝正前方(假定以x轴的正负方向为正前方)射击,范围内你的箭都含有神弓赋予的力量。”

    这两句话说明,射出去的箭是不会下垂的,所以射出去的箭的路径是直线。

    线索二

    “前面是一个垂直于地的墙,射过去的箭的伤害以箭为中心是一个圆锥,母线和中心轴的夹角度数大概是15°的样子,越远伤害范围越大。” 以及图片:

    这两个点说明了,射出去的箭的伤害范围问题

    题意分析

    话不多说,看图:

    我们需要算出,伤害半径也就是第一张图片所示的箭轴的路径长度,根据路径长度计算伤害半径(不会的找你的高中老师):

    abs(x2 - x1) * tan(15 * atan(1.0) * 4 / 180)

    其中atan(1.0)*4 就是3.14159.....(可以使用有限小数代替);当然,表示tan(15 * atan(1.0) * 4 / 180)也可以用数学运算得出为(2 - sqrt(3))

    然后就很简单了啊,abs(y2 - y1) 若大就可以射中,否则即可

    可行代码

    #include <math.h>
    #include <stdio.h>
    #define PI atan(1.0) * 4
    int main() {
        int T;
        scanf("%d", &T);
        while (T--) {
            int x1, y1, x2, y2;
            scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
            double r = abs(x2 - x1) * tan(15 * PI / 180); // 伤害半径
            double R = abs(y1 - y2);
            if (r < R)
                printf("NO\n");
            else
                printf("YES\n");
        }
        return 0;
    }
    

    END 加油

    Information

    ID
    125
    Time
    1000ms
    Memory
    256MiB
    Difficulty
    9
    Tags
    # Submissions
    354
    Accepted
    25
    Uploaded By