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 ...
随机推荐
- 全站HTTPS简单实践
第一个里程碑:创建https证书 [root@web01 backup]# openssl req -new -x509 -nodes -out server.crt -keyout server.k ...
- 关于easyui的datagrid属性出现乱码问题
今天遇到这个问题也是纠结了好久,经过在网上各种查询总结,得出以下经验: 1:网页字符集设置为UTF-8: <meta content="charset=UTF-8 " /&g ...
- Java IO编程全解(六)——4种I/O的对比与选型
转载请注明出处:http://www.cnblogs.com/Joanna-Yan/p/7804185.html 前面讲到:Java IO编程全解(五)--AIO编程 为了防止由于对一些技术概念和术语 ...
- 【机器学习实战】第13章 利用 PCA 来简化数据
第13章 利用 PCA 来简化数据 降维技术 场景 我们正通过电视观看体育比赛,在电视的显示器上有一个球. 显示器大概包含了100万像素点,而球则可能是由较少的像素点组成,例如说一千个像素点. 人们实 ...
- Remove Untagged Images From Docker
I've been playing around a lot with docker. It's awesome, and it creates a whole new world of possib ...
- Java 核心内容相关面试题【3】
目录 面向对象编程(OOP) 常见的Java问题 Java线程 Java集合类 垃圾收集器 异常处理 Java小应用程序(Applet) Swing JDBC 远程方法调用(RMI) Servlet ...
- Linux常用命令100个用法
平时用linux时,我有一个习惯就是把遇到的,比较有用,并且容易忘的命令,放到一个文本文件中,没事的时候可以拿出来看看,这样可以加深映像,时间长了这些命令的用法基本上都能掌握了.以下是100个用法,有 ...
- 清理win10过期补丁的命令
作用是删除已经被新版本取代的旧系统文件 DISM.exe /Online /Cleanup-Image /StartComponentCleanup /ResetBase 注1: 执行后, 补丁就无法 ...
- [原创]阿里云RocketMQ踩过的哪些坑
由于公司的最近开始使用RocketMQ来做支付业务处理, 便开启了学习阿里云RocketMQ的学习与实践之路, 其中踩了不少的坑, 大部份是由于没有仔细查看阿里云的技术文档而踩的坑. 但是有一个非常大 ...
- C#调用DLL文件时参数对应表
Wtypes.h中的非托管类型 非托管 C语言类型 托管类名 说明HANDLE void* Syste ...