关于二分法中取中间值时向下和向上取整的问题(由大白LA3971想到的) (二)

2014-11-24 03:28:21 · 作者: · 浏览: 1
的意思,但是在不同提交的遇到了一个问题。

我的TLE了。

当时我是百思不得其解,后来仔细思考了之后发现了一个问题。那就是你在这个程序中是求一个合理区间的最大值。

举个例子,假如我们的最后要取的值为5,区间也是[0,5],用向下取整的话

L R M

0 5 2

2 5 3

3 5 4

4 5 4

4 5 4

。。。

发现问题了吧,这个时候就会陷入死循环。

再来一个例子,假如我们是求一个合理区间的最小值,二分的代码


[cpp]
while(L {
M=(L+R+1)/2;
if(ok(M))
R=M;
else
L=M+1;
}

while(L {
M=(L+R+1)/2;
if(ok(M))
R=M;
else
L=M+1;
}我们还是用向上取整来做。区间为[0,5],最后的值为0

L R M

0 5 3

0 3 2

0 2 1

0 1 1

0 1 1

。。。

又陷入了死循环,但是我们可以发现如果这时用向下取整就是可行的了。

所以由上面就可以得出,

当我们使用二分法求某个合理区间最值的时候,我们要十分注意两个端点的极端值的情况。

当然还有一种更保险的方法

那就是不用上面的二分的方法

在二分的时候用另外一个变量来记录合理值,然后L=M+1 OR R=M-1

所以这样的话是不回陷入到死循环里面去的

这就是我由这T想到了,好久不写博客了。还是要捡起来啊。