二分法
大一的刚学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