题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2298
题意:在(0,0)处有弓箭,可以调整角度,给定目标的坐标(x,y)和弓箭的发射速度,问调整到什么角度(弧度制)时能击中目标;
题解:首先要根据高中的知识得到公式 t=x/(v*cos(angle)) Y=v*sin(angle)*t-G*t*t/2(angle时角度) 然后根据三分得到y最大时的角度max, 然后 L=0,R=max二分得到等于y时的角度;
注意如果最大达不到就输出-1,注意精度问题
AC代码:
#include<stdio.h>
#include<iostream>
#include<string.h>
#include<string>
#include<algorithm>
#include<math.h>
#include<map>
#include<set>
#include<queue>
#include<vector>
#include<stack>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int N=1e5+10;
const double pi=acos(-1.0);
const double G=9.8;
double x,y,v;
double calculate(double angle)
{
double t=x/(v*cos(angle));
return v*sin(angle)*t-G*t*t/2;
}
int main()
{
int T;
for(scanf("%d",&T);T--;)
{
scanf("%lf %lf %lf",&x,&y,&v);
double l=0,r=pi;
double mid,midmid;
while(r-l>1e-10)//三分求极值
{
mid=l+(r-l)/3;
midmid=r-(r-l)/3;
if(calculate(mid)>=calculate(midmid))
r=midmid;
else
l=mid;
}
if(calculate(mid)<y)
{
printf("-1\n");
continue;
}
l=0,r=mid;
while(r-l>1e-8)//二分求答案
{
mid=(l+r)/2;
if(calculate(mid)>=y)
r=mid;
else l=mid;
}
printf("%lf\n",r);
}
return 0;
}