关于二分的心得

    以前就做过一些有关二分的题目,但最近这段时间再次做二分时,发现自己有时候还是会犯一些同样的错误,因此觉得是时候该总结一下了。

 

1.实数

   对于实数问题,我们的循环结束条件是up-low>eps,其中eps是我们定义的控制精度的一个常量,具体取多少根据情况而定(一般取1e-6就够了);PI要取acos(-1.0)然后就是在计算时要注意精度丢失问题,尽量避免除法和三角函数运算;另外我们最好直接二分要求的结果,而不要设置中间变量,因为从 中间变量->结果 这一步计算很有可能就会产生较大误差。

while(up-low>eps)
{
     mid=(low+up)/2;
    if(condition==true)
        low=mid;
    else
        up=mid;
}


 

(ps:对于g++编译器和c++编译器,前者输出函数printf中用%f,而后者用%lf,切记!!!)

 

2.整数

    整数唯一的好处就是不用考虑精度问题了,说实话本人也较喜欢这类问题。但整数还需要注意一个细节,

就是等号的处理,这点必须要考虑清楚,如果相等,到底是处理low还是处理up,这个要结合题意来看。另外为了使循环能终止,我更倾向于下面这种写法,最后结果取up,当然仅供参考。

while(up>low)
        {
            mid=(low+up)>>1;
            int step=jump(mid);//因为此处只是截取的部分代码,所以不必深究jump函数
            if(step>m)
                low=mid+1;
            else
                up=mid;
        }


 

 

 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值