题目大意:
一个人从原点射箭,求要射中(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;
}