练习二 1004 Toxophily

来源:互联网 发布:淘宝达人怎么发帖 编辑:程序博客网 时间:2024/06/11 01:54
<span style="font-size:14px;">题目:</span>
<span style="font-size:14px;"></span><div class="panel_content">The recreation center of WHU ACM Team has indoor billiards, Ping Pang, chess and bridge, toxophily, deluxe ballrooms KTV rooms, fishing, climbing, and so on.<br>We all like toxophily.<br><br>Bob is hooked on toxophily recently. Assume that Bob is at point (0,0) and he wants to shoot the fruits on a nearby tree. He can adjust the angle to fix the trajectory. Unfortunately, he always fails at that. Can you help him?<br><br>Now given the object's coordinates, please calculate the angle between the arrow and x-axis at Bob's point. Assume that g=9.8N/m. <br></div><div class="panel_bottom"> </div><div class="panel_title" align="left">Input</div><div class="panel_content">The input consists of several test cases. The first line of input consists of an integer T, indicating the number of test cases. Each test case is on a separated line, and it consists three floating point numbers: x, y, v. x and y indicate the coordinate of the fruit. v is the arrow's exit speed.<br>Technical Specification<br><br>1. T ≤ 100.<br>2. 0 ≤ x, y, v ≤ 10000. <br></div><div class="panel_bottom"> </div><div class="panel_title" align="left">Output</div><div class="panel_content">For each test case, output the smallest answer rounded to six fractional digits on a separated line.<br>Output "-1", if there's no possible answer.<br><br>Please use radian as unit. <br></div><div class="panel_bottom"> </div><div class="panel_title" align="left">Sample Input</div><div class="panel_content"><pre><div style="FONT-FAMILY: Courier New,Courier,monospace">3<br>0.222018 23.901887 121.909183<br>39.096669 110.210922 20.270030<br>138.355025 2028.716904 25.079551<br></div>

Sample Output
1.561582<br>-1<br>-1<br>

<span style="font-size:14px;">题意:bob在(0,0)点想射到在点(x,y)的水果,初速度是v,且g=9.8,求能射到苹果的最小角度。</span>
<span style="font-size:14px;">解题思路:由题意可写出物理关系式y=tan(t)*x+g*x*x/(2*v*v*cos(t)*cos(t)),t就是速度方向与x的夹角,由关系式可知在(0,π/2)内先增后减</span>
<span style="font-size:14px;">可以先用三分求出t的最大值,然后再用二分在(0,t0)内求出符合要求的值。</span>
<span style="font-size:14px;">感想:二分加三分,三分用的还是不好。</span>
<span style="font-size:14px;">代码:</span>
<span style="font-size:14px;">#include<iostream>  #include<cstdio> #include<iomanip> #include<cmath>   using namespace std;   const double PI=acos(-1.0);  const double g=9.8;  double x,y,v;  double f(double t)  {      return x*tan(t)-g*x*x/2/(v*v*cos(t)*cos(t));  }  double ef(double left,double right){double mid;while(right-left>=1e-9){mid=(left+right)/2;if(f(mid)>=y)right=mid;else left=mid;}return left;}double sf(double left,double right)  {      double mid,midmid;while(right-left>=1e-9)     {          mid=left+(right-left)/3;          midmid=right-(right-left)/3;          if(f(mid)<=f(midmid))              left=mid;          else              right=midmid;      }      return (mid+midmid)/2;  }    int main()  {      int t;      double t0;      cin>>t;      while(t--)      {          cin>>x>>y>>v;          t0=sf(0,PI/2);          if(f(t0)<y)              cout<<"-1"<<endl;else cout<<fixed<<setprecision(6)<<ef(0,t0)<<endl;     }      return 0;  }  </span>

0 0
原创粉丝点击