1004 Toxophily
2016-04-13 21:37
357 查看
题意:
给一个速度V,求最小角度使射出的箭能够到达给定的点(x,y)如果不能输出-1赎罪最小的角度
思路:
根据给出的坐标可以求出关于角度tanx的公式:x^2*g/(2*v^2)*tan^2(ß) - x*tan(ß) +y + x^2*g/(2*v^2) = 0;
可以求出a,b,c 进而求出方程的解
如果x和y同时为0 角度为0;
如果点位与y轴上 角度为90;
方程无解或者解围负数时 输出-1
给一个速度V,求最小角度使射出的箭能够到达给定的点(x,y)如果不能输出-1赎罪最小的角度
思路:
根据给出的坐标可以求出关于角度tanx的公式:x^2*g/(2*v^2)*tan^2(ß) - x*tan(ß) +y + x^2*g/(2*v^2) = 0;
可以求出a,b,c 进而求出方程的解
如果x和y同时为0 角度为0;
如果点位与y轴上 角度为90;
方程无解或者解围负数时 输出-1
#include <iostream> #include <stdio.h> #include <math.h> #include <fstream> #include<iomanip> using namespace std; int main() { int t; double a,b,c,angle,z; double x,y,v,g = 9.8,T,ans1,ans2; fstream cin("E:/C++/IN/aaa.txt"); cin>>t; while(t--) { cin>>x>>y>>v; if(x==0&&y==0) cout<<0<<endl; else if(x==0&&y>0) cout<<90<<endl; 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; cout << setprecision(6) << setiosflags(ios::fixed) << angle << endl;; } if(ans1<0&&ans2<0) cout<<-1<<endl; } } } return 0; }
相关文章推荐
- 《Linux内核分析》 第八节 进程的切换和一般的执行过程
- 搭建storm集群(apache-storm-0.9.5.tar.gz) .
- Linux内核分析——第八周学习笔记20135308
- 检测nginx配置是否正确的方法
- 【opencv】goodFeaturesToTrack源码分析-2-Shi-Tomasi角点检测
- nginx reload报错
- CentOS 7 更新源 – 使用国内 163 yum 源
- linux常用命令
- DedeAMPZ 是快速配置php+mysql环境的一个整合套件,包含php5.2、Apache2.2、MySql5,下载地址:
- linux命令界面入门级操作
- centos配置IP并远程登录
- 关于Linux C语言开发字符越界的问题
- Linux内核分析 笔记八 进程的切换和系统的一般执行过程 ——by王玥
- linux的pam验证
- Linux哲学思想
- 关于OPencv里仿射变化和透射变换的理解
- 如何为网站选择支付接口
- tomcat使用startup.bat启动闪退的解决办法
- Linux OpenCV笔记
- 《linux高性能服务器编程》学习笔记(一)