HDU 2298 Toxophily 【二分+三分】
一个人站在(0,0)处射箭,箭的速度为v,问是否能够射到(x,y)处,并求最小角度。
首先需要判断在满足X=x的情况下最大高度hmax是否能够达到y,根据物理公式可得
h=vy*t-0.5*g*t*t
vx=v*cos(a)
vy=v*sin(a)
t=x/vx
由此可推出:h=x*tan(a)-(g*x*x)/(2*v*v)/cos(a)/cos(a)
g,x,v已知,设A=x,B=(g*x*x)/(2*v*v)
原式化为:h=A*tan(a)+(-B/(cos(a)^2))
由于凸函数有以下性质:
1,如果f和g是凸函数,那么m(x) = max{f(x),g(x)}和h(x) = f(x) + g(x)也是凸函数。
2,如果f和g是凸函数,且g递增,那么h(x) = g(f(x))是凸函数。
tan(a)为凸函数,cos(a)为凸函数,-(1/x)为增凸函数。所以h为凸函数。
以上是h函数是凸函数的证明,因为网上的题解基本都是一句带过,小白的我又看不懂,只能自己证明。若有出错的地方,请大神指出。拜谢。
因此可以三分出hmax。
若能到达,再通过二分得到最小的仰角。
#include<stdio.h>
#include<string.h>
#include<math.h>
const double pi=acos(-1.0),g=9.8,eps=1e-;
double x,y,v;
double cal(double a){
double vx=v*cos(a);
double vy=v*sin(a);
double t=x/vx;
double h=vy*t-g*t*t/;
return h;
}
double thrdiv(){
double l=0.0,r=pi/2.0,lm,rm;
while(r-l>eps){
lm=(l*2.0+r)/3.0;
rm=(l+r*2.0)/3.0;
if(cal(lm)>cal(rm))
r=rm;
else
l=lm;
}
return l;
}
double bin(double a){
double l=,r=a,mid;
while(r-l>eps){
mid=(l+r)/;
if(cal(mid)<y)
l=mid;
else
r=mid;
}
return l;
}
int main(){
double ans,h;
int t;
scanf("%d",&t);
while(t--){
scanf("%lf%lf%lf",&x,&y,&v);
ans=thrdiv();h=cal(ans);
if(y-h>eps)
printf("-1\n");
else if(fabs(y-h)<=eps)
printf("%.6f\n",ans);
else{
ans=bin(ans);
printf("%.6f\n",ans);
}
}
return ;
}
HDU 2298 Toxophily 【二分+三分】的更多相关文章
- HDU 2298 Toxophily(公式/三分+二分)
Toxophily Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total ...
- HDU 2298 Toxophily
题目: Description The recreation center of WHU ACM Team has indoor billiards, Ping Pang, chess and bri ...
- HDU -2298 Toxophily(三分法)
这道题目,可以推出物理公式直接来做,但是如果推不出来就必须用程序的一种算法来实现了,物理公式只是适合这一个或者某个题,但是这种下面这种解决问题的方法确实解决了一类问题 ----三分法,大家可能都听说过 ...
- HDU 2298 三分
斜抛从(0,0)到(x,y),问其角度. 首先观察下就知道抛物线上横坐标为x的点与给定的点的距离与角度关系并不是线性的,当角度大于一定值时可能会时距离单调递减,所以先三分求个角度范围,保证其点一定在抛 ...
- Toxophily-数论以及二分三分
G - Toxophily Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submi ...
- HDU 2298(纯物理加解一元二次方程)
Toxophily Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total S ...
- 第二次组队赛 二分&三分全场
网址:CSUST 7月30日(二分和三分) 这次的比赛是二分&三分专题,说实话以前都没有接触过二分,就在比赛前听渊神略讲了下.......不过做着做着就对二分熟悉了,果然做题是学习的好方法啊~ ...
- Toxophily HDU - 2298 三分+二分
代码+解析: 1 //题意: 2 //有一个大炮在(0,0)位置,为你可不可以把炮弹射到(x,y)这个位置 3 //题目给你炮弹初始速度,让你求能不能找出来一个炮弹射出时角度满足题意 4 //题解: ...
- [hdu 2298] 物理推导+二分答案
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2298 #include<bits/stdc++.h> using namespace st ...
随机推荐
- ahjesus如何在windows下制作适用于mac的u盘启动盘
先用macdrive把U盘格式化成hfs+格式,然后下载原版dmg格式系统,再用ultraISO将dmg转成ISO格式(也可以不用转换),最后用ultraISO里面“启动”--->“写入硬盘映像 ...
- 从自签名证书导出pfx和cer证书
完整代码: public sealed class DataCertificate { #region 生成证书 /// <summary> /// 根据指定的证书名和makecert全路 ...
- django 中间件
django处理一个Request的过程是首先通过django 中间件,然后再通过默认的URL方式进行的.所以说我们要做的就是在django 中间件这个地方把所有Request拦截住,用我们自己的方式 ...
- Android群英传笔记系列三 view的自定义:实现一个模拟下载
1.实现效果:动态显示进度(分别显示了整个的动态改变的过程,然后完成后,弹出一个对话框) 2.实现过程:可以分为绘制一个圆,圆弧和文本三部分,然后在MainAcitivity中通过线程模拟 ...
- iOS开发--隐藏(去除)导航栏底部横线
iOS开发大部分情况下会使用到导航栏,由于我司的app导航栏需要与下面紧挨着的窗口颜色一致,导航栏底部的横线就会影响这个美观,LZ使用了以下方法.觉得不错,分享来给小伙伴们. 1)声明UIImageV ...
- mac上的替代软件
文本编辑器:bbedit 视频播放器:Movist 图片浏览:LilyView 远程桌面:Remotix 虚拟主机:parallels desktop svn client:cornerstone o ...
- Cocos2d-X-3.0之后的版本的环境搭建
由于cocos2d游戏开发引擎更新十分频繁,官方文档同步不够及时和完善.所以不要照着官方文档来照做生成工程. <点击图片就能进入网站> 具体的步骤: 1.获取cocos2d-X的源码v3. ...
- iOS中倒计时
方法一:使用NSTimer来实现(比较适用于发送短信验证码倒计时) 主要是利用NSTimer的scheduledTimerWithTimeInterval方法来每秒执行一次changeTime方法 / ...
- windows 编程中的常见bug
错误 1 : error LNK2001: 无法解析的外部符号 _WTSQueryUserToken@8 解决办法: ——>查看链接器->输入->附加依赖项,依照debug模 ...
- android文件存储位置切换
最近有个需求,助手的google卫星地图和OpenCycleMap下载的离线地图数据,要能够在内置存储和外置存储空间之间切换,因为离线瓦片数据非常大,很多户外用户希望将这些文件存储在外置TF卡上,不占 ...