1. 程式人生 > >「HDU 2298」Toxophily

「HDU 2298」Toxophily

題意 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>
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\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