HDU 5144 NPY and shot【物理+三分查找】

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5144

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.

三分查找:https://www.cnblogs.com/ECJTUACM-873284962/p/6536414.html

题解:

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <queue>
#include <stack>
#include <set>
#include <map>
#define INF 0x3f3f3f3f
#define LL long long
#define PI acos(-1)
#define g 9.8
using namespace std;
const int maxn=1005;
double cal(int h0,int v,double angle){
	double vx=v*cos(angle);
	double vy=v*sin(angle);
	double t=vy/g;
	double s=vx*t;
	double h=h0*1.0+0.5*g*t*t;
	t=sqrt(2.0*h/g) ;
	s+=t*vx;
	return s;
}
double search(int h0,int v){
	double l=0.0,r=(PI*1.0)/2;
	double mid,midmid;
	while(r-l>1e-8){
		mid=(l+r)/2.0;
		midmid=(mid+r)/2.0;
		if(cal(h0,v,mid)>=cal(h0,v,midmid))
			r=midmid;
		else l=mid;
	}
	return cal(h0,v,l);
}
int main(){
	int T,H,v0;
	scanf("%d",&T) ;
	while(T--){
		scanf("%d %d",&H,&v0);
		printf("%.2lf\n",search(H,v0));
	}
    return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值