用 assert 守住划分
每次划分完,用 assert 验证划分的不变式:枢轴左边都比它小、右边都不比它小,并数一数验过几次划分。排 {17, 24, 15, 13, 23},输出「排序结果(用 - 连)/验过几次」。 (本题用 g++ -std=c++17 -O0
实测期望接不接近 7.4
前面算出随机快排在 5 个元素上的期望比较次数是 37/5 = 7.4。用固定种子跑 20000 次,看平均值和 7.4 差多少:差不到 0.1 就输出「接近」。(抽到哪些数取决于本平台 g++ 的 uniform_int_distribu
随机下标只能在区间里
下面的随机快排把挑枢轴的范围写成了 pick(0, r),会挑到当前区间外面的元素。改对范围,排 1000 个固定种子生成的随机数,输出是否排好。 (本题用 g++ -std=c++17 -O0 编译。)
近似算法给的是什么保证
第 1 步:三条互不相连的边 第 2 步:贪心:两头都收下 第 3 步:贪心:两头都收下 第 4 步:贪心:两头都收下 第 5 步:其实每条挑一头就够 第 6 步:收的点最多是它的两倍 A B C D E F 一个 2-近似算法,保证的是【
NP-hard 意味着什么
某个问题被证明是 NP-hard。这告诉你【0】。
贪心和最优各要几个点
一张七个点的图(顶点覆盖:挑最少的点,让每条边至少有一头被挑中)。贪心和暴力最优各挑了几个点?暴力用位掩码枚举子集: #include <algorithm> #include <iostream> #include
换一张图比值顶到 2
换一张图:三条互不相连的边。贪心和最优各要几个点? #include <algorithm> #include <iostream> #include <string> #include <vect
写出 2-近似的顶点覆盖
补全贪心:挨条边看,两头都没被盖住就把两头一起收下。输出「贪心个数/最优个数」。 (本题用 g++ -std=c++17 -O0 编译。)
两张图的近似比
两张图各算一次近似比,用整数表示(放大 100 倍),再验一次两者都没超过 2 倍。输出如 150/200/都没超。 (本题用 g++ -std=c++17 -O0 编译。)
最优要试多少个子集
暴力求最优要一个个试子集。数一数它试了多少个、贪心只看了多少条边,再算出七个点一共有多少个子集。 (本题用 g++ -std=c++17 -O0 编译。)