博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu 2298 Toxophily
阅读量:5890 次
发布时间:2019-06-19

本文共 2387 字,大约阅读时间需要 7 分钟。

Toxophily

Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 99 Accepted Submission(s): 56
Problem Description
The recreation center of WHU ACM Team has indoor billiards, Ping Pang, chess and bridge, toxophily, deluxe ballrooms KTV rooms, fishing, climbing, and so on.
We all like toxophily.
Bob is hooked on toxophily recently. Assume that Bob is at point (0,0) and he wants to shoot the fruits on a nearby tree. He can adjust the angle to fix the trajectory. Unfortunately, he always fails at that. Can you help him?
Now given the object's coordinates, please calculate the angle between the arrow and x-axis at Bob's point. Assume that g=9.8N/m.
 
Input
The input consists of several test cases. The first line of input consists of an integer T, indicating the number of test cases. Each test case is on a separated line, and it consists three floating point numbers: x, y, v. x and y indicate the coordinate of the fruit. v is the arrow's exit speed.
Technical Specification
1. T ≤ 100.
2. 0 ≤ x, y, v ≤ 10000.
 
Output
For each test case, output the smallest answer rounded to six fractional digits on a separated line.
Output "-1", if there's no possible answer.
Please use radian as unit.
 
Sample Input
30.222018 23.901887 121.90918339.096669 110.210922 20.270030138.355025 2028.716904 25.079551
 
Sample Output
1.561582-1-1
分析:
 网上这道题的解法几乎都是2分法效率还可以,但是用数学方法解题可以实现0ms通过。
 用公式,根据正交分解坐标系,得出方程的通式。
想 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 
#include
#include
using namespace std; int main() {
int t; double a,b,c,angle,z; double x,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"); else if(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
http://www.cnblogs.com/newpanderking/archive/2011/08/25/2153590.html
你可能感兴趣的文章
Java中Volatile关键字详解
查看>>
显示刚刚添加的最后一条数据,access,选择语句,select
查看>>
C++ 取指针地址
查看>>
Vmware虚拟机三种网络模式详解
查看>>
常见的版本控制工具?
查看>>
贪吃蛇逻辑代码
查看>>
python字符串删除,列表删除以及字典删除的总结
查看>>
实现c协程
查看>>
浏览器访问jsp页面
查看>>
ASP.NET视频教程 手把手教你做企业论坛网站 视频教程
查看>>
PIE SDK辐射定标
查看>>
GO:格式化代码
查看>>
[LeetCode] Meeting Rooms II
查看>>
20165211 2017-2018-2 《Java程序设计》第5周学习总结
查看>>
模型分离(选做)
查看>>
vim 更改注释颜色
查看>>
Apache/Tomcat/JBOSS/Nginx区别
查看>>
POJ3648:Wedding——题解(配2-SAT简易讲解)
查看>>
[BZOJ3399] [Usaco2009 Mar]Sand Castle城堡(排序)
查看>>
第五届金梧奖移动广告创意节暨移动营销峰会2019(上海)
查看>>