对拍保平安

所在前面:

其实很久以前就听说对拍了,但是一直没有去学习。临近NOIP,随手写了两道题,都是因为一些小问题而GG,这要是NOIP我就挂掉了,所以为了能更稳一些,彻底践行对拍保平安的思想,去学习了如何进行对拍。

过程

首先你需要一个暴力算法,非常暴力的暴力算法(没有任何技巧而言的暴力!!!)

注意,你的暴力程序需要保证一定是对的,一定是对的!!!所以说在写暴力的时候不能有任何的技巧或者算法(对于我来说),然后认真的检查暴力程序是不是真正的正确。

然后拿出来你写的比较高级的算法QAQ,和一个数据生成器。

关于数据生成器的写法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<iostream>
#include<cstdio>
#include<ctime>
#include<cstdlib>
using namespace std;
int n,a,b,m,S;
int main()
{
srand((int)time(NULL));
freopen("All.in","w",stdout);
n=rand()%1000; m=rand()%1000; S=rand();
cout<<n<<' '<<m<<' '<<S<<endl;
while(n-->0)
{
a=rand()%1000;
b=rand()%1000;
cout<<a<<' '<<b<<endl;
}
while(m-->0)
{
a=rand()%1000;
b=rand()%1000;
if(a>b) cout<<b<<' '<<a<<endl;
else cout<<a<<' '<<b<<endl;
}
return 0;
}
  • 比较重要的,也就是需要记住的就是下面的东西:
标号 单词 意义
1. Violence 暴力
2. Advanced 高级
3. cstdlib 头文件
4. ctime 头文件
5. srand((int)time(NULL)); 初始化随机数种子
6. fc 比较程序
7. pause 关闭程序
8. if not errorlevel 1 goto again 如果不是错误就重新执行
  • 记住了然后背代码啊,这个是对拍用的bat程序:
1
2
3
4
5
6
7
:again
Makedata
Advanced
Violent
fc Advanced.out Violent.out
if not errorlevel 1 goto again
pause
  • 这个是Violence的
1
2
freopen("All.in","r",stdin);
freopen("Violent.out","w",stdout);
  • 这个是Advanced的
1
2
freopen("All.in","r",stdin);
freopen("Advanced.out","w",stdout);
  • 这个是Makedata的
1
freopen("All.in","w",stdout);

然后再同一个文件夹里面生成exe文件,然后直接执行bat文件就行了:

如图:你需要有很多的文件才行的。

所以说需要养成一个好的习惯了,除非写一些大模拟,大暴力和一些无法使用对拍程序来验证代码的正确性的时候,其他都需要写对拍程序,这样的话熟练程度就会大幅度的提高,考试就不用担心犯一些脑残的错误了QAQ(当然是仍然需要徒手构造一些比较大的数据来验证暴力程序是否正确)

大概就这样