十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Dev-C++对拍学习笔记

Dev-C++对拍学习笔记 ​对拍是一种在OI赛制下很实用的一种调代码的方法它可以验证代码输出是否正确注意本博客针对与Dev-C用户编写1.对拍基本设置首先对拍需要一个保证正确的暴力程序比如要求111~nnn所有数字的和可以用111~nnn的for循环暴力求和这样保证正确但是大数据下过不了、待检验的程序还是上面的例子这个程序可以是求和公式n×(n1)2\frac{n \times (n1)}{2}2n×(n1)​以及数据生成程序2.数据生成器数据生成程序需要用到随机数函数mt19937他会比srand更好重复率更低接下来展示几个常见数据生成函数(注以下代码由Deepseek大模型生成)//生成整数或小数#includebits/stdc.husingnamespacestd;// 高品质随机数避免 Windows 下 rand() 周期短的问题mt19937rng(chrono::steady_clock::now().time_since_epoch().count());// 返回 [l, r] 的随机整数intrandint(intl,intr){returnuniform_int_distributionint(l,r)(rng);}// 返回 [l, r] 的随机小数doubleranddouble(doublel,doubler){returnuniform_real_distributiondouble(l,r)(rng);}intmain(){intnrandint(1,10);//生成1~10的整数intmrandint(1,10);//同上doublekranddouble(1,2);//生成1~2的小数coutn m k;return0;}//用于生成1~n的排列即1~n各出现一次#includebits/stdc.husingnamespacestd;mt19937rng(chrono::steady_clock::now().time_since_epoch().count());intrandint(intl,intr){returnuniform_int_distributionint(l,r)(rng);}intmain(){intnrandint(1,10);vectorintp(n);iota(p.begin(),p.end(),1);shuffle(p.begin(),p.end(),rng);for(inti0;in;i)coutp[i] ;return0;}//生成一颗随机树#includebits/stdc.husingnamespacestd;mt19937rng(chrono::steady_clock::now().time_since_epoch().count());intrandint(intl,intr){returnuniform_int_distributionint(l,r)(rng);}intmain(){intnrandint(1,10);// 方法每次新点连向已有的随机点生成随机树vectorintparent(n1);for(inti2;in;i){parent[i]randint(1,i-1);// 保证不形成环}for(inti2;in;i){couti parent[i]\n;}return0;}//生成一张随机无向图含边权//n个点m条边没有重边和自环#includebits/stdc.husingnamespacestd;mt19937rng(chrono::steady_clock::now().time_since_epoch().count());intrandint(intl,intr){returnuniform_int_distributionint(l,r)(rng);}intmain(){intnrandint(1,10);// 随机点数intmrandint(1,15);// 随机边数setpairint,intedges;// 用set去重避免生成重复边while((int)edges.size()m){inturandint(1,n);intvrandint(1,n);if(uv)continue;// 不要自环if(uv)swap(u,v);// 保证 u v便于去重edges.insert({u,v});}for(auto[u,v]:edges){intwrandint(1,100);// 随机边权coutu v w\n;}return0;}//生成一个只含有小写字母的字符串#includebits/stdc.husingnamespacestd;mt19937rng(chrono::steady_clock::now().time_since_epoch().count());intrandint(intl,intr){returnuniform_int_distributionint(l,r)(rng);}intmain(){string s;for(inti0;in;i){schar(arandint(0,25));}couts\n;return0;}//用于生成区间查询(常用于莫队线段树前缀和等)#includebits/stdc.husingnamespacestd;mt19937rng(chrono::steady_clock::now().time_since_epoch().count());intrandint(intl,intr){returnuniform_int_distributionint(l,r)(rng);}intmain(){intlrandint(1,n);intrrandint(l,n);// 保证 l rcoutl r\n;return0;}//用于生成多组输入#includebits/stdc.husingnamespacestd;mt19937rng(chrono::steady_clock::now().time_since_epoch().count());intrandint(intl,intr){returnuniform_int_distributionint(l,r)(rng);}intmain(){intTrandint(1,5);//T也要随机数coutT\n;while(T--){//生成每组数据}return0;}3.示例题目大意输入一个数nnn输出111~nnn的和现在桌面上创建一个文件夹如图在这个文件夹里面写上面三个程序第一个暴力程序写好后保存为baoli.cpp(名字可以自行更改但是用这个名字更易于理解)然后编译得到baoli.exe。再写第二个待检验程序写好后保存为need.cpp然后编译得到need.exe。再写第三个数据生成程序记为data.cpp然后编译得到data.exe那么暴力代码很简单#includebits/stdc.husingnamespacestd;intmain(){intn;cinn;intcnt0;for(inti1;in;i){cnti;}coutcnt;return0;}待检验代码就是求和公式#includebits/stdc.husingnamespacestd;intmain(){intn;cinn;cout(n1)*n/2;return0;}数据生成程序生成一个整数nnn即可#includebits/stdc.husingnamespacestd;mt19937rng(chrono::steady_clock::now().time_since_epoch().count());intrandint(intl,intr){returnuniform_int_distributionint(l,r)(rng);}intmain(){intnrandint(1,100);coutn\n;return0;}好了现在文件夹应该长这样子现在还需要一个脚本程序duipai.bat它的作用就是自动循环执行「生成数据 → 跑暴力程序 → 跑待检验程序 → 比对结果」这一整套流程一旦发现两边输出不一致就立刻停下来提醒你。就在这个文件夹里面新建一个记事本重命名为duipai.bat一定要记得更改扩展名.txt不要是duipai.bat.txt现在右键点击duipai.bat注意不是双击运行打开之后里面应该是空的复制下面这一段脚本代码到duipai.batecho off :loop data.exe input.txt baoli.exe input.txt std.txt need.exe input.txt my.txt fc std.txt my.txt if not errorlevel 1 goto loop pause goto loop保存退出双击运行此时应该是无法运行的如果您运行成功了就请跳转到标题4因为g是静态的而这个脚本需要动态的环境那怎么办找到自己的Dev-C右键点击找到打开文件所在的位置按钮就可以跳转到一个文件夹Dev-Cpp不同版本可能不一样然后找到MinGW64文件夹打开注意不是MinGW32找到bin文件夹打开在很多文件里面找到libwinpthread-1.dll复制粘贴到对拍文件夹如图现在双击运行duipai.bat如果黑色窗口一直在输出说明对拍始终通过暂时没有异常退出黑色窗口发现多了几个文件input.txtmy.txtstd.txtmy.txt的作用是记录待检验代码的输出std.txt的作用是记录暴力代码的输出input.txt的作用将在下文讲现在把待检验代码加点料#includebits/stdc.husingnamespacestd;intmain(){intn;cinn;if(n95)cout*;cout(n1)*n/2;return0;}再编译运行duipai.bat发现他运行到一半停止了说明发现了错误此时退出黑色窗口打开my.txt和std.txt可以查看待检验代码的输出就是那个加了料的程序和暴力程序输出再打开input.txt就可以查看那个错误的输入4.注意1.测试代码必须要和暴力代码输出一模一样行末空格和末尾回车一定要保持一致不能一个有一个没有这是会判错的2.所有的文件都要放在同一个文件夹下3.代码文件有一点修改都需要重新编译4.本方法仅能查出WARE等问题查不出TLE与MLE请在赛时自行检查时间复杂度和空间复杂度5.完结撒花~
返回列表