练习二 1004 Toxophily

<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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值