NPY and shot
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 1035 Accepted Submission(s): 428
Problem Description
NPY is going to have a PE test.One of the test subjects is throwing the shot.The height of NPY is H meters.He can throw the shot at the speed of v0 m/s and at the height of exactly H meters.He wonders if he throws the shot at the best angle,how far can he throw ?(The acceleration of gravity, g, is 9.8m/s2)
Input
The first line contains a integer T(T≤10000),which indicates the number of test cases.The next T lines,each contains 2 integers H(0≤h≤10000m),which means the height of NPY,and v0(0≤v0≤10000m/s), which means the initial velocity.
Output
For each query,print a real number X that was rounded to 2 digits after decimal point in a separate line.X indicates the farthest distance he can throw.
Sample Input
2
0 1
1 2
Sample Output
0.10
0.99
Hint
If the height of NPY is 0,and he throws the shot at the 45° angle, he can throw farthest. Source
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5144
分析:做三分做上瘾了,再来一道,物理数学得学好啊,不然有些题就算算法知道你也写不来啊,都是思维题,典型的质点运动学+三分查找!
下面给出AC代码:
1 #include2 using namespace std; 3 const double pi=acos(-1.0); 4 const double g=9.8; 5 double v,h; 6 const double eps=1e-8; 7 double ans(double a) 8 { 9 double a1=v*v*sin(a)*sin(a);10 double a2=2*g*h;11 a1=a1+a2;12 a1=sqrt(a1);13 a1=a1/g;14 a1=a1+v*sin(a)/g;15 a1=a1*v*cos(a);16 return a1;17 }18 int main()19 {20 int T;21 while(scanf("%d",&T)!=EOF)22 {23 while(T--)24 {25 scanf("%lf%lf",&h,&v);26 double l=0;27 double r=pi/2;28 double midx,midy;29 while (r-l>eps)30 {31 midx=(l+l+r)/3;32 midy=(l+r+r)/3;33 if(ans(midx)>ans(midy))34 r=midy;35 else l=midx;36 }37 printf("%.2f\n",ans(l));38 }39 }40 return 0;41 }