第一步把不变式验起来
交付流程第一步:给自己的算法写一个循环不变式,在正数和全负数两组数据上各验一遍,输出各自成立的轮数。 (本题用 g++ -std=c++17 -O0 编译。)
第二步对拍快速证伪
第二步:拿一个笨办法对拍。把 {17, 24, 15, 13, 23} 的全部 120 种排列都跑一遍,输出「是否全部一致/最大值」。 (本题用 g++ -std=c++17 -O0 编译。)
第三步三步论证
第三步:把不变式证明的三步各验一次。这一步和第二步的区别是——它不依赖你挑了哪些输入。输出如 过/过/过。 (本题用 g++ -std=c++17 -O0 编译。)
第四步复杂度依据
第四步:给出复杂度依据——数操作次数,不掐表。在 5 / 10 / 20 个元素上各数一次比较次数。 (本题用 g++ -std=c++17 -O0 编译。)
交付五条验收一起过
最后一步:把「设计 + 证明 + 复杂度」收成五条验收条款:对拍、不变式保持、全负数组也对、比较次数正好是 n-1、前四条全成立。输出如 过/过/过/过/过。 (本题用 g++ -std=c++17 -O0 编译。)
找到反例之后先做什么
用对拍找到了一个让程序出错的输入,接下来最该先做的是【0】。
补写随机枢轴快排
场景:实验机上 ~/work/pf/rqs.cpp 读入 n 和 n 个整数,用快排排好后输出。挑枢轴那一段还是空的。 任务:补全 choose_pivot:用 mt19937 和 uniform_int_distribution 在 [l
有序输入别被卡住
场景:~/work/pf/sortbig.cpp 用「总取最右一个当枢轴」的快排排序。随机数据很快,可输入是已经排好序的 10 万个数时,它慢得跑不完。 任务:改写成随机选枢轴(或排序前先 shuffle),让有序输入也能在 2 秒内排完;
证伪一个看起来对的贪心
场景:~/work/pf/coins.cpp 用贪心找零:每次都拿面值最大、还拿得下的那枚硬币,输出一共用了几枚。面值写在 ~/题目.txt 里,大多数金额它都是对的,但不是所有金额都对。 任务:在 ~/题目.txt 给的金额范围里找一个金
找出写错的二分
场景:~/work/pf/bs.cpp 想求「第一个不小于 x 的下标」,但它的循环不变式写错了:右边界从 n-1 开始,漏掉了「答案可能是 n」。大多数输入它都对。 任务:构造一组输入让它出错:~/题目.txt 规定了数组长度和取值范围。