题目大意:
        一个人从原点射箭,求要射中(x,y)的那个物体的箭射出前与x轴的角度。(用弧度表示)
解题思路:
        用公式的方法,
        x = v * t * cos(a); -> t = x/v/cos(a);
        y = v*sin(a)*t - 1/2*g*t*t;
        将一式中的t代入y中,变形得到:
        g*x*x*tan^2(a) - 2*v*v*x + g*x*x + 2*v*v*y = 0;
        然后用求根公式求解,题目要求求最小的那个角度,所以等于
        atan((-b-sqrt(temp))/2.0/a),有两种情况要考虑,1、方程无解输出-1。2、目标处于y轴的时候输出pi/2,或者目标在x轴上,输出0
代码:

#include<iostream>
#include<cmath>
using namespace std;

const double g = 9.8;

double getA(double x, double v)
{
    return g * x * x;
}

double getB(double x, double v)
{
    return -2.0 * v * v * x;
}

double getC(double x, double y, double v)
{
    return g * x * x + 2.0 * v * v * y;
}

int main(void)
{
    int cas;
    scanf("%d", &cas);
    while(cas--)
    {
        double x, y , v;
        scanf("%lf%lf%lf", &x, &y, &v);

        if((x == 0 && y == 0) || (x == 0 && y != 0))
        {
            printf("0\n");
            continue;
        }

        if(x == 0 && y != 0)
        {
            printf("%.6lf\n", 3.1415926 / 2);
            continue;
        }

        double a, b, c;
        a = getA(x, v);
        b = getB(x, v);
        c = getC(x, y, v);

        double temp = b * b - 4.0 * a * c;
        if(temp < 0)
        {
            printf("-1\n");
            continue;
        }
        printf("%.6lf\n", atan((-b - sqrt(temp)) / 2.0 / a));
    }
    return 0;
}

posted on 2012-08-03 02:11  cchun  阅读(152)  评论(0编辑  收藏  举报