三分+二分求极值点或者与x轴交点



https://www.bnuoj.com/v3/contest_show.php?cid=7785#problem/D (三分+二分或者数学方法求解一元二次函数)

题意:给你两个球的初始坐标,半径和速度矢量,然后求两个球能否相撞,相撞则输出相撞的时间,不能则输出最近间隔的距离。

题解:正常方法是设时间t,然后列出坐标 (x1+vx1*t,y1+vy1*t) , (x2+vx2*t,y2+vy2*t)

然后考虑这两个点的距离的平方减去(r1+r2)^2这个函数,然后b^2-4ac判断是否有解,如果有解,因为t=0的时候,距离等于0,就要判断对称轴的位置,这种高中知识就不赘述了,但是这里有个坑,就是对称轴是-b/2a,a可能为0,我开头煞笔了,以为a是vx^2+vy^2,不可能为0,后来发现这个是两个球的相对速度,所以可能是0的,这里如果不特判,会wa,不是RE,因为浮点数1.0/0.0=not a number(nan),而不是整数除0返回RE, 涨了一波姿势,以后一定要各种注意啊。无解情况也要判断对称轴。

AC代码:http://paste.ubuntu.net/16006740/


然后介绍新学的方法,就是三分+二分,三分大家都知道是求一元二次函数的极值点的,所以可以直接对两点距离这个函数进行三分,浮点数的二分三分是用for(i=1,i<100),然后得到极值点 t=l 后判断和两个半径和的大小,如果小于就是相撞,说明相撞的时间在0到l之间,这会是单调的,所以用二分,然后求出正好相撞的t就行,如果没有相撞,输出极值点的就行了。十分简单并且没有多少坑点,唯一需要注意的就是精度问题,经过老顽童巨巨指点后,得知二分三分里不要用eps,因为二分三分的精度很高了,然后其他地方可以设eps,题目要求1e-6就差不多设1e-6到1e-8就行了,感觉学到了很多知识啊这题,虽然题目不难

AC代码:http://paste.ubuntu.net/16006860/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值