不能小看的二分

二分法

大一的刚学c语言的时候就学了二分法,之前也感觉用处一般,不是很大,最近做了一些题,确实不能小看二分法,关于二分法STL里面有现成的lower_bound方法我之前的文章,提到过

二分法做的题还是不少,可以分为最大化最小值最大化平均值,主要思想就是本来一些问题必须要用挨个枚举解决的,而且正好这些枚举得数又是有序的,所以这时候就可以通过二分法提升一下效率了
有如下一些题
poj1064
poj2456
poj3273
poj3258
poj2976
poj3122
poj3111

poj3122
这道题还是用那种思路,但是有个小问题,就在于题目要求了误差最多正负0.001,然后如果这时候我们自己手写π,比如我就是自己直接写的3.1415926,我还感觉我这儿小数点后都有7位了,随便够用了,但是举个反例测试数据

/*
1
3 1
10000 10000 10000
*/

如果π = 3.1415926的话结果为
在这里插入图片描述

但如果我们用c++定义的π = 3.1415926535897931
在这里插入图片描述
这个就正好不符合题目要去的最小误差。。。所以以后用π的时候,要用系统提供的#include<cmath>,然后就是用系统定义的常量M_PI,但是我在poj上面他居然说没有定义,多半有事g++和c++的区别
在这里插入图片描述
所以以后要用π的时候最好就现在控制台打印出来,然后自己复制到代码中,通过#define定义

#define PI 3.1415926535897931

还有就是double 如果小数点后4位,出的时候会出现误差,比如16 / 8.00001 = 2

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值