题目:最小仰角
题意:已知发射点坐标为(0,0)和重力加速度g=9.8,给出目标的坐标和初速度,求能够击中目标的最小仰角。
思路:(1)直接假设能够击中目标,写出公式,化成一元二次方程,把公式内的三角函数全部化成tan,判断[0,PI/2]有无解;
(2)运用三分+二分,首先三分仰角,求出轨迹在x处的纵坐标,若纵坐标最大值小于y,则直接输出-1,三分过后[0,r]上就是单调递增的, 直接二分即可
感想:要知道物理知识,
代码:
#include<iostream>
#include<stdio.h>
#include<algorithm>
#include<numeric>
#include<math.h>
#include<cstdio>
using namespace std;
const double PI = 3.1415926535;
const double eps = 1e-10;
double g=9.8;
int main()
{
int n;
double x,y,v,ans;
cin>>n;
while(n--)
{
cin>>x>>y>>v;
double mid,l,r,vx,vy,t,mVal;
l = 0;r = PI/2.0;
bool suc = false;
while(r-l>=eps)
{
mid = (l+r)/2.0;
vx = v*cos(mid),vy = v*sin(mid);t = x/vx;
mVal = vy*t-0.5*9.8*t*t;
if(mVal < y)
{
l = mid;
}
else if(mVal > y || vy/9.8 < t)
{
suc = true;
ans = mid;
r = mid;
}
else
{
suc = true;
ans = mid;
break;
}
}
if(suc) printf("%.6lf\n",ans);
else printf("-1\n");
}
return 0;
}