练习二1004

来源:互联网 发布:公需课挂机软件2017 编辑:程序博客网 时间:2024/06/16 18:25

Toxophily

             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;

}

 

 

0 0