HDU 2298 Toxophily(公式/三分+二分)
Toxophily
Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 1429 Accepted Submission(s): 739
We all like toxophily.
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?
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.
the fruit. v is the arrow's exit speed.
Technical Specification
1. T ≤ 100.
2. 0 ≤ x, y, v ≤ 10000.
Output "-1", if there's no possible answer.
Please use radian as unit.
3
0.222018 23.901887 121.909183
39.096669 110.210922 20.270030
138.355025 2028.716904 25.079551
已知发射点坐标为(0,0)和重力加速度g=9.8,给出目标的坐标和初速度。求可以击中目标的最小仰角。有两种思路。第一种是直接如果可以击中目标。写出公式,化成一元二次方程,把公式内的三角函数所有化成tan,推断[0。PI/2]有无解;另外一种方法就是三分+二分。首先三分仰角,求出轨迹在x处的纵坐标最大值。若纵坐标最大值小于y,则直接输出-1,三分过后[0,r]上就是单调递增的,直接二分就可以。
#include<stack>//推导公式
#include<queue>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#pragma commment(linker,"/STACK: 102400000 102400000")
#define mset0(t) memset(t,0,sizeof(t))
#define lson a,b,l,mid,cur<<1
#define rson a,b,mid+1,r,cur<<1|1
using namespace std;
const double PI=3.141592653;
const double eps=1e-8;
const int MAXN=500020;
const double g=9.8;
double x,y,v,ans; int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif // ONLINE_JUDGE
int tcase;
scanf("%d",&tcase);
while(tcase--)
{
scanf("%lf%lf%lf",&x,&y,&v);
/*if(x==0||y==0) //这个if语句主要是用来特判0 50 10000这样的数据的。但不知道为什么去掉这个也能AC
{
if(x==0&&y==0)
printf("0.000000\n");
else if(y==0)
printf("-1\n");
else
if(v*v*0.5/g>=y)
printf("%.6lf\n",PI/2);
else
printf("-1\n");
continue;
}*/
ans=3;
double a=g*x*x;
double b=-2*v*v*x;
double c=2*v*v*y+g*x*x;
double der=b*b-4*a*c;
if(der<0)
{
printf("-1\n");
continue;
}
double ans1=atan((-b-sqrt(der))/(2*a));
double ans2=atan((-b+sqrt(der))/(2*a));
if(ans1>=0&&ans1<=PI/2)
ans=min(ans,ans1);
if(ans2>=0&&ans2<=PI/2)
ans=min(ans,ans2);
printf("%.6lf\n",ans);
}
return 0;
}
#include<stack>//三分+二分代码
#include<queue>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#pragma commment(linker,"/STACK: 102400000 102400000")
#define mset0(t) memset(t,0,sizeof(t))
#define lson a,b,l,mid,cur<<1
#define rson a,b,mid+1,r,cur<<1|1
using namespace std;
const double PI=3.141592653;
const double eps=1e-8;
const int MAXN=500020;
const double g=9.8;
double x,y,v,ans; double geth(double r)
{
return (v*sin(r))*(x/(v*cos(r)))-0.5*g*(x/(v*cos(r)))*(x/(v*cos(r)));
} int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif // ONLINE_JUDGE
int tcase;
scanf("%d",&tcase);
while(tcase--)
{
scanf("%lf%lf%lf",&x,&y,&v);
if(x==0&&y==0)
{
printf("0.000000\n");
continue;
}
if(y==0)
{
printf("-1\n");
continue;
}
if(x==0)
{
if(v*v*0.5/g>=y)
printf("%.6lf\n",PI/2);
else
printf("-1\n");
continue;
}
double l=0,r=PI/2;
int cnt=10000;
while(cnt--)
{
double mid=(l+r)/2;
double mmid=(mid+r)/2;
if(geth(mid)>geth(mmid))
r=mmid;
else
l=mid;
}
if(geth(r)<y)
{
printf("-1\n");
continue;
}
l=0;
r=r;
cnt=10000;
while(cnt--)
{
double mid=(l+r)/2;
if(geth(mid)>y)
r=mid;
else
l=mid;
}
printf("%.6lf\n",r); }
return 0;
}
HDU 2298 Toxophily(公式/三分+二分)的更多相关文章
- HDU 2298 Toxophily 【二分+三分】
一个人站在(0,0)处射箭,箭的速度为v,问是否能够射到(x,y)处,并求最小角度. 首先需要判断在满足X=x的情况下最大高度hmax是否能够达到y,根据物理公式可得 h=vy*t-0.5*g*t*t ...
- HDU -2298 Toxophily(三分法)
这道题目,可以推出物理公式直接来做,但是如果推不出来就必须用程序的一种算法来实现了,物理公式只是适合这一个或者某个题,但是这种下面这种解决问题的方法确实解决了一类问题 ----三分法,大家可能都听说过 ...
- HDU 2298 Toxophily
题目: Description The recreation center of WHU ACM Team has indoor billiards, Ping Pang, chess and bri ...
- HDU 2298 三分
斜抛从(0,0)到(x,y),问其角度. 首先观察下就知道抛物线上横坐标为x的点与给定的点的距离与角度关系并不是线性的,当角度大于一定值时可能会时距离单调递减,所以先三分求个角度范围,保证其点一定在抛 ...
- hdu 3433 A Task Process 二分+dp
A Task Process Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- HDU 3622 Bomb Game(二分+2-SAT)
Bomb Game Time Limit: 10000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- Toxophily HDU - 2298 三分+二分
代码+解析: 1 //题意: 2 //有一个大炮在(0,0)位置,为你可不可以把炮弹射到(x,y)这个位置 3 //题目给你炮弹初始速度,让你求能不能找出来一个炮弹射出时角度满足题意 4 //题解: ...
- HDU 2298:Toxophily(推公式)
http://acm.hdu.edu.cn/showproblem.php?pid=2298 题意:给出一个x,y,v,问从(0,0)以v为初速度射箭,能否射到(x,y)这个点,如果能,输出最小的射出 ...
- [hdu 2298] 物理推导+二分答案
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2298 #include<bits/stdc++.h> using namespace st ...
随机推荐
- header操作cookie
root@kl20080094:~# curl -I "http://www.xxx.com" HTTP/1.1 200 OK Server: nginx/0.8.53 Date: ...
- 讨论.NET Core 配置对GC 工作模式与内存的影响
引出问题: Asp.net core应用在 Kubernetes上内存使用率过高问题分析 https://mp.weixin.qq.com/s/PqhUzvFpzopU7rVRgdy7eg 这篇文章中 ...
- HTTP请求过程(http是一种无状态协议,即不建立持久的连接)
一.一个完整的HTTP请求,通常有7个步骤: 1.建立TCP连接: 2.web浏览器向web服务器发送请求命令: 3.浏览器发送请求头信息: 4.服务器应答: 5.服务器发送应答头信息: 6.服务器向 ...
- Oracle.DataAccess.Client.OracleCommand”的类型初始值设定项引发异常。
Oracle.DataAccess.Client.OracleCommand”的类型初始值设定项引发异常. 64位系统下,部署32位odp.net,出现问题.解决方法:卸载32位xcopy odt.n ...
- Mac上编译并运行Android5.0源码
下载.配置环境.build和运行参考的都是Android Source提供的文档,包括:Initializing a Build Environment,Downloading the Source和 ...
- Python字符编码详解(转)
http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html 在没有reload(sys)之前调用sys.setdefaultencoding ...
- FPGA调试光纤模块
利用FPGA调试光纤接口接口: 由于与项目需要,前段时间调试了光纤接口,记录一些设计经验. 设计中采用FPGA控制光纤模块完成光纤数据的收发,FPGA采用Xilinx公司的Spartan6 LX45T ...
- Vue自定义指令获取DOM元素
我们知道,Vue.js的核心是数据驱动,当数据有所变化时,DOM就会被更新,比如: <span v-text="msg"></span> export de ...
- Chapter 6: The Memory Hierarchy
Disk Geometry: 磁盘的结构如图,每个面为surface,surface上的同心圆为track,track包含sector,不同的surface的同半径track构成cylinder.越外 ...
- Entity Framework——常见报错总结
1 实体属性配置为IsRequired()对更新的影响 抛出异常类型DbEntityValidationException 表结构: 实体: public class User { public in ...