您的位置:首页 > 运维架构

练习二 1004 Toxophily

2016-04-24 20:37 288 查看
<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>


[align=left]Sample Output[/align]

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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: