「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的主要内容,如果未能解决你的问题,请参考以下文章

「HDU 2298」Toxophily

HDU-2298 Toxophily (三分法入门系列)

[hdu2298] 物理推导+二分答案

HDU 2298 三分

Toxophily-数论以及二分三分

bzoj2298: [HAOI2011]problem a DP