1 solutions
-
0
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