HDU

来源:互联网 发布:数据有效性wps2016 编辑:程序博客网 时间:2024/06/11 22:03

题目链接:https://vjudge.net/problem/HDU-1174

解题思路:从警察的角度看土匪,由于土匪的头是个球,无论从哪个角度看都是一个圆,那么可以通过tan求出最大的夹角,然后再算枪的方向 和 警察的头心与土匪头心的向量 所形成的角度,判断是否在最大夹角内即可

AC代码:

#include<cstdio>#include<cmath>using namespace std;struct Pos{    double _x, _y, _z;    Pos(double x=0.0, double y=0.0, double z=0.0) :_x(x), _y(y), _z(z) {}    Pos operator-(const Pos& a)const    {        return Pos(_x - a._x, _y - a._y, _z - a._z);    }    double length()    {        return sqrt(_x*_x + _y*_y + _z*_z);    }};double angle(const Pos&a, const Pos&b){    double tmp = (a._x*b._x + a._y*b._y + a._z*b._z);    tmp /= sqrt(a._x*a._x + a._y*a._y + a._z*a._z);    tmp /= sqrt(b._x*b._x + b._y*b._y + b._z*b._z);    return acos(tmp);}int main(){    int t;scanf("%d", &t);    while (t--)    {        double h1, r1, x1, y1, z1;        double h2, r2, x2, y2, z2, x3, y3, z3;        scanf("%lf%lf%lf%lf%lf", &h1, &r1, &x1, &y1, &z1);        scanf("%lf%lf%lf%lf%lf%lf%lf%lf", &h2, &r2, &x2, &y2, &z2, &x3, &y3, &z3);        Pos police = Pos(x2, y2, z2 + h2*0.9 - r2);        Pos bandit = Pos(x1, y1, z1 + h1 - r1);        Pos vec1 = bandit - police;        if (angle(Pos(x3, y3, z3), vec1) <= atan(r1/vec1.length()))            puts("YES");        else            puts("NO");    }    return 0;}
原创粉丝点击