数一段值里有几个
补全 count_range:数出值在 [15, 23] 之间(含两端)的元素有几个。 (本题用 g++ -std=c++17 -O0 编译。)
中点别算溢出了
补全 safe_mid:lo = 2000000000、hi = 2100000000 时,lo + hi 已经超过 int 的上限。现在的写法会溢出(结果是乱的,C++ 里有符号整数溢出属于未定义行为),改成不会溢出的写法。 (本题用 g
二分最常见的错在哪
第 1 步:条件写成了 lo < hi 第 2 步:17 小,往右 第 3 步:23 还小,再往右 第 4 步:lo 等于 hi:循环不进了 第 5 步:24 那一格从没被比过 13 15 17 23 24 lo hi mid 二分写
lo < hi 和 lo <= hi
闭区间二分里把 while (lo <= hi) 写成 while (lo < hi),后果是【0】。
二分死循环通常怎么来的
二分陷入死循环,通常是因为【0】。
用 lo < hi 会怎样
下面这段二分把循环条件写成了 lo < hi,在 13、15、17、23、24 里找 24。运行它: #include <iostream> #include <string> #include <vec
改成 lo <= hi 呢
同一段代码,只把循环条件改成 lo <= hi。运行它: #include <iostream> #include <string> #include <vector> using namespac
修一个漏查的二分
下面这段二分用了 while (lo < hi),会漏掉最后一格。把它改对,然后找 24。 (本题用 g++ -std=c++17 -O0 编译。)
修一个转不出来的二分
下面这段二分忘了更新边界,范围永远不缩小。模板里放了一个步数上限,不改的话它会返回 -2(而不是一直转下去)。把两句边界更新补上,然后找 24。 (本题用 g++ -std=c++17 -O0 编译。)
三个边界一起验
写一个正确的二分,然后一次验三条:找 24(最后一格)得 4、找 13(第一格)得 0、找 20(不存在)得 -1。三条全过输出 边界通过,否则输出 有失败。 (本题用 g++ -std=c++17 -O0 编译。)