Time Limit: 3000/1000MS(Java/Others) Memory Limit: 32768/32768 K(Java/Others)
TotalSubmission(s):1440 Accepted Submission(s): 749
Problem Description
The recreationcenter of WHU ACM Team has indoor billiards, Ping Pang,chess and bridge,toxophily, deluxe ballrooms KTV rooms, fishing, climbing, andso on.
We all like toxophily.
Bob is hooked on toxophily recently. Assume that Bob is at point (0,0) andhewants to shoot the fruits on a nearby tree. He can adjust the angle to fixthetrajectory. Unfortunately, he always fails at that. Can you help him?
Now given the object's coordinates, please calculate the angle between thearrowand x-axis at Bob's point. Assume that g=9.8N/m.
Input
The inputconsists of several test cases. The first line of input consistsof an integerT, indicating the number of test cases. Each test case is on aseparated line,and it consists three floating point numbers: x, y, v. x and yindicate thecoordinate of the fruit. v is the arrow's exit speed.
Technical Specification
1. T ≤ 100.
2. 0 ≤ x, y, v ≤ 10000.
Output
For each testcase, output the smallest answer rounded to six fractionaldigits on aseparated line.
Output "-1", if there's no possible answer.
Please use radian as unit.
Sample Input
3
0.22201823.901887121.909183
39.096669110.21092220.270030
138.3550252028.71690425.079551
Sample Output
1.561582
-1
-1
题意:
给你一个向上速度V,让你求出最小的角度使得你射出的箭能够到达给定的点(x,y)。如果不能输出为-1,如果能到达,输出最小的角度。
解题思路:
用公式,根据正交分解坐标系,得出方程的通式。
想 x^2*g/(2*v^2)*tan^2(ß) - x*tan(ß) +y +x^2*g/(2*v^2) = 0;
即:a = g*pow(x,2)/(2*pow(v,2));
b = -x;
c = y +g*pow(x,2)/(2*pow(v,2));
根据求根公式求出根。
注意讨论:
(1) x==0&&y==0时,ß = 0;
(2) x==0&&y>0时,ß=90;
(3)方程无解时ß=-1;
(4)方程的解为负数时,ß=-1;(0<=ß<=90)。
#include <iostream>
#include <stdio.h>
#include <math.h>
using namespace std;
int main()
{
int t;
doublea,b,c,angle,z;
doublex,y,v,g = 9.8,T,ans1,ans2;
scanf("%d",&t);
while(t--)
{
scanf("%lf%lf%lf",&x,&y,&v);
if(x==0&&y==0)
printf("0\n");
elseif(x==0&&y>0)
printf("90\n");
else
{
a =g*pow(x,2)/(2*pow(v,2));
b =-x;
c =y+a;
T =pow(b,2) - 4*a*c;
angle = 0;
if(T<0)
printf("-1\n");
else
{
ans1 = ((-b)+pow(T,1.0/2))/(2*a);
ans2 = ((-b)-pow(T,1.0/2))/(2*a);
if(ans1>=0) angle = atan(ans1);
if(ans2>=0)
{
z = atan(ans2);
if(z<angle) angle = z;
printf("%.6f\n",angle);
}
if(ans1<0&&ans2<0)
printf("-1\n");
}
}
}
return 0;
}