两种找法的步数
在 13、15、17、23、24 里找 24。运行下面这段程序: #include <iostream> #include <string> #include <vector> using namespa
第一步线性查找
最终作品第一步:补全 lfind(找不到返回 -1)。把两个结果拼起来输出:找 17、找 20,中间用 / 隔开。 (本题用 g++ -std=c++17 -O0 编译。)
第二步二分查找
补全 bfind(闭区间 + while (lo <= hi))。把三个结果拼起来输出:找 24、找 13、找 20。 (本题用 g++ -std=c++17 -O0 编译。)
第三步重复元素的边界
补全 right_bound(left_bound 已给出),在 13、15、17、17、17、23、24 里定位 17。把 左边界/右边界/出现次数 拼起来输出。 (本题用 g++ -std=c++17 -O0 编译。)
第四步前缀搜索
补全 collect 里的递归,在 apple、app、apply、banana 里补全 app,把结果按字典序用 / 拼起来输出。 (本题用 g++ -std=c++17 -O0 编译。)
交付四种找法一起验收
这是这条路线的最终作品。线性、二分、左右边界、前缀搜索的代码都已给出,其中二分的比较、右边界的记录、前缀树的递归收集三处还空着。补全后一次验完五条:线性找 17 得 2、找 20 得 -1;二分找 24 得 4、找 13 得 0、找 20
对拍用的标准答案怎么写
对拍时,拿来当标准答案的那个程序应该【0】。
修好漏解的二分
场景:实验机上 ~/work/bs/find.cpp 读入一个有序数组和若干个要查的数,用二分输出每个数的下标(不在就输出 -1)。可有些明明在数组里的数,它说找不到。 任务:修好 bfind 的循环条件和边界配套。make 编译,./fi
修好会溢出的中点
场景:~/work/bs/mid.cpp 对每个 t,在 0~2100000000 之间二分出最小的 x,使 x / 3 ≥ t。t 小的时候都对,t 一大就出错甚至卡住。 任务:修好中点的算法,让 t 到 7×10^8 也算对。make
修好转不出来的左边界
场景:~/work/bs/ge.cpp 对每个查询 x,输出有序数组里第一个 ≥ x 的下标(都比 x 小就输出数组长度)。可有些查询一跑就停不下来。 任务:修好 first_ge,让它每一轮都真正缩小范围。make 编译后用 sample