「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\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");

 

posted @ 2018-07-06 21:51  LocaEtric  阅读(158)  评论(0编辑  收藏  举报