「HDU 2298」Toxophily
阿新 • • 發佈:2018-07-07
題意 fin else 給定 min div tro del 角度
題意:原題在這
假設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> usingnamespace 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\n",-1); else { double ans=atan( (-b-sqrt(dlta))/(2*a) ); printf("%.6lf\n",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\n",eta1<eta2?eta1:eta2); else if(eta1>=minn && eta1<=maxx) printf("%.6lf\n",eta1); else if(eta2>=minn && eta2<=maxx) printf("%.6lf\n",eta2); else printf("-1\n");
「HDU 2298」Toxophily