「HDU 2298」Toxophily
Posted locaetric
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「HDU 2298」Toxophily相关的知识,希望对你有一定的参考价值。
题意:原题在这
假设LCY站在(0,0)点,现给定平面直角坐标系内ZJ坐标,求ZJ与LCY的连线与X轴连线的角度
取g=9.8m/s²
思路:
感谢Beef的运动学分析及奇怪的口音让我差点打不出来“θ”
首先∵速度是斜方向的,所以Vx=V·cosθ,Vy=V·sinθ
又∵Sx=Vx·t,Sy=Vy·t
∴X=Vcosθ·t,Y=Vsinθ·t
到此为止理论分解完成了
------------------------------------------------------------------------------------------------
然鹅,题目中说考虑重力加速度g=9.8m/s²
所以Y=Vsinθ·t-(1/2)·gt²
代换t=X/Vcosθ得
最后得到二元一次方程:(g·X²)tan²θ-(2·V²·X)tanθ+(2·V²·Y+g·X²)=0
∴a=g·X²,b=-s2·V²·X,c=2·V²·Y+g·X²,Δ=b²-4ac
∴tanθ=(-b±√Δ)/2a
解完之后判断θ是否合法
代码:
#include<iostream> #include<cmath> #include<cstring> #include<algorithm> using namespace std; #define pi acos(-1.0)//弧度制180° #define g 9.8 #define maxx pi/2 #define minn 0 int T; double x,y,v;//X,Y是ZJ坐标,V是LCY的移动速度 int main() { cin>>T; for(int cas=1;cas<=T;cas++) { cin>>x>>y>>v; double a=g*x*x , b=-2*v*v*x , c=2*v*v*y+g*x*x , dlta=b*b-4*a*c; if(dlta<0) printf("%d ",-1); else { double ans=atan( (-b-sqrt(dlta))/(2*a) ); printf("%.6lf ",ans); } } return 0; }
朴素做法:
double a=g*x*x , b=-2*v*v*x , c=2*v*v*y+g*x*x , dlta=b*b-4*a*c; double tan1=(-b+sqrt(dlta))/(2*a) , eta1=atan(tan1); double tan2=(-b-sqrt(dlta))/(2*a) , eta2=atan(tan2); if((eta1>=minn && eta1<=maxx) && (eta2>=minn && eta2<=maxx)) printf("%.6lf ",eta1<eta2?eta1:eta2); else if(eta1>=minn && eta1<=maxx) printf("%.6lf ",eta1); else if(eta2>=minn && eta2<=maxx) printf("%.6lf ",eta2); else printf("-1 ");
以上是关于「HDU 2298」Toxophily的主要内容,如果未能解决你的问题,请参考以下文章