练习二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;
}
- 练习二1004
- 练习二 1004 Toxophily
- 练习二 1004 射箭问题
- 练习(二)
- 练习二
- 练习二
- 2016SDAU编程练习二1004
- 2016sdau课程练习专题二 1004
- 数据库练习二答案
- 面试练习二
- 基础练习二
- JavaScript练习(二)
- Delphi练习二
- 练习基础题《二》
- 查询练习(二)
- oracle练习(二)
- Map练习(二)
- 排序算法练习二
- mybatis注解详解
- zoj3929 Deque and Balls 【找规律】
- C和C指针读书笔记
- lightoj 1383 - Underwater Snipers 二分+贪心
- 安卓开发培训(3.1 文件读写)
- 练习二1004
- Special equations(数学筛)
- RMQ 算法
- Android stdio Ndk HelloWorld
- 我们也说说Android.mk(5) - 案例教程
- 第一次正式java web开发项目的总结
- Block 分析
- myeclipse快捷键大全(转载)
- 使用宏避免多次包含