对拍找错

10 分钟

对拍是抓错的利器。做法:写一个"笨但一定对"的暴力程序(bf)、你的正解(sol)、再写一个数据生成器(gen);循环生成随机数据,两个程序各跑一遍,比对输出,一旦不一致就抓到了错误,还能直接拿到最小反例去调试。

生成器要能每次产出不同的小数据:

// gen.cpp —— 用命令行参数当随机种子
#include <bits/stdc++.h>
using namespace std;
int main(int argc, char** argv) {
    srand(atoi(argv[1]));           // 每次传不同种子, 数据才不同
    int n = rand() % 10 + 1;        // 规模故意开小, 好定位
    cout << n << "\n";
    for (int i = 0; i < n; i++) cout << rand() % 100 << " ";
}

外面用一个 shell 循环:gen $i 生成数据,分别喂给两个程序,diff 比对,不同就停下。关键坑:数据规模一定要小(十个以内),大数据即使拍出不一致也难以人肉排查;随机种子要变,否则每次拍的是同一组数据,等于没拍。

小纸条

给一道做过的题写一个暴力版对拍。

登录 后可看答案

对拍找错 · 考级冲刺 · op599 课程