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

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

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://uuodx.baihongyu.com/

你可能感兴趣的文章
mysql使用时的一些常用命令
查看>>
ajax传输json到后台
查看>>
控制器加载的玄机
查看>>
res索引讲解(drawable、layout、values)等目录的分辨率和layout的横竖屏
查看>>
team链路聚合,
查看>>
利用SQL对度假区进行评分
查看>>
好快时间,时间好快,追的上吗?
查看>>
轻松教你如何用自己的电脑做服务器
查看>>
企业“云”
查看>>
我的友情链接
查看>>
storm supervisor挂掉错误
查看>>
Linux man命令的使用方法
查看>>
hbase region in transition
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
jfianl中将验证码做成拦截器,可以重复使用
查看>>
我的友情链接
查看>>
三阶魔方教程图解
查看>>
ConcurrentHashMap的了解
查看>>
spring的annotation-driven配置事务管理器详解
查看>>