对拍

概念

对拍是一种比赛中的检查技巧。对于正解不是暴力的题目,可以通过对拍的技巧来检查题目是否正确。通常情况下,如果时间充裕,对拍是检查的不二选择。

准备事项

需要准备的程序如下: 1.不确定正确性的“正解”( cpp),用于被检查。 2.保证正确性的程序( std),用于生成正确答案。 3.数据生成器( data),用于生成测试数据。 4.对拍主程序( control),用于控制对拍过程。

具体流程

首先准备一份不确定正确性的程序,这个程序可以是动态规划等较为高效的算法,也可以是剪枝后的搜索,唯一要求是不可以和 std 相同。

接着,准备一份时间复杂度不限,但是正确性显然的程序。理论上,任何算法都可以用作 checker,但是搜索的特性决定了它是最合适的 checker。

然后,准备一个随机生成数据的程序。C++中的rand()函数可以用作 data,用于生成数据的语句如下:

temp = rand() % maxn + 1

其中temp是存储测试数据的变量,maxn是题目的数据范围。

最后,我们需要一个程序来自动化对拍的过程。严格意义上可以是.bat脚本,也可以是.exe(可执行程序)。本蒟蒻倾向于后者。

————————————————————————————————————————--

这个程序需要自动运行 data、 std和 cpp,并比对 std和 cpp的输出,给出 Wrong Answer或 Accepted的结果。自动运行可以使用system语句,比对结果既可以自己编写,也可以使用fc命令。fc命令需要在system语句内使用。

以上程序通常需要放在同一文件夹内,否则执行system语句时需要填写绝对路径而非相对路径。

标题模板

数据生成器:

#include<bits/stdc++.h>
using namespace std;
#define rand_max 10
int main(){
	freopen("1.in","w",stdout);
	int n = rand() % rand_max + 1;;
    printf("%d\n", n);
    for (int i = 1; i <= n; i++){
        int temp = rand() % rand_max + 1;
        printf("%d ", temp);
    }
    puts("");
}

对拍主程序:

#include<bits/stdc++.h>
using namespace std;
int main(){
	system("w1.exe < input.txt > ans.out");
    system("w2.exe < input.txt > output.out");
    if (system("fc output.out ans.out"))
        printf("Wrong Answer\n");
    else
        printf("Accepted\n");
}

————QAQ

posted @   蒟蒻orz  阅读(32)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话
点击右上角即可分享
微信分享提示