1.题目编号:1004
2.简单题意:Bob射击,假设他在(0,0)位置,他想射击在最近的一棵树上的水果,并且他可以调整角度来修正射击轨道,不幸的是他总是失败。现在给出一个物体的坐标,编写程序计算Bob所在点的x轴和箭之间的角度。T组数据,每组数据给出水果的想x,y坐标和箭头发射的速度v
3.解题思路形成过程:这是一道涉及物理的题目,首先进行分析角度、速度和箭向上和向前飞出的距离关系。将速度正交分解,假设角度为α得到x=t*v*cos(α),y=t*v*sin(α)-(1/2)g*t*t;联立之后得到:y=x*tan(α)-(g/2)*[(x^2)/v^2*cos(α)*cos(α)];经过变可以得到:a=g*pow(x,2)/(2*pow(v,2)),b=-x,c=y+g*pow(x,2)/(2*pow(v,2));除此之外还有两个例外,当x,y均为0时,角度为0,x为0,而y>0时则为90度,然后二分。
4.感悟:上一题是涉及数学,这一题是涉及物理,相必,程序员都得是全才
5.AC的代码:
#include <iostream>
#include <cmath>
using namespace std;
int main()
{
int T;
double a,b,c,angle,z;
double x,y,v,g=9.8,l,ans1,ans2;
cin>>T;
while(T--){
cin>>x>>y>>v;
if(x==0&&y==0)
cout<<0<<endl;
else if(x==0&&y>0)
cout<<90<<endl;
else
{
a = g*pow(x,2)/(2*pow(v,2));
b = -x;
c = y+a;
l = pow(b,2) - 4*a*c;
angle = 0;
if(l<0)
cout<<-1<<endl;
else
{
ans1 = ((-b)+pow(l,1.0/2))/(2*a);
ans2 = ((-b)-pow(l,1.0/2))/(2*a);
if(ans1>=0) angle = atan(ans1);
if(ans2>=0)
{
z = atan(ans2);
if(z<angle) angle = z;
printf("%.6f\n",angle);
}
if(ans1<0&&ans2<0)
cout<<-1<<endl;
}
}
}
return 0;
}
原题:
3<br>0.222018 23.901887 121.909183<br>39.096669 110.210922 20.270030<br>138.355025 2028.716904 25.079551<br>
1.561582<br>-1<br>-1<br>