对拍 - 详解
新知识涌入
用处: 检验程序正确性
例 题:
这是一道前缀和的模板题
我们有2种写法:前缀和 或 暴力
ac.cpp
//前缀和
#include<bits/stdc++.h>
using namespace std;
long long a[100010], num[100010];
long long n, k, sum = 0;
int main(){
freopen("data.in", "r", stdin);
freopen("AC.out", "w", stdout);
cin >> n >> k;
for(int i = 1; i <= n; i++){
cin >> a[i];
num[i] = num[i - 1] + a[i];
}
for(int i = k; i <= n; i++){
sum += num[i] - num[i - k];
}
cout << sum << endl;
return 0;
}
check.cpp
//暴力
#include <bits/stdc++.h>
using namespace std;
long long n, k, a[100009], ans;
int main(){
freopen("data.in", "r", stdin);
freopen("check.out", "w", stdout);
cin >> n >> k;
for(int i = 1; i <= n; i++) cin>>a[i];
for(int i = 1; i <= n - k + 1; i++){
for(int j = i; j <= i + k - 1; j++){
ans += a[j];
}
}
cout << ans << endl;
return 0;
}
suiji.cpp
//按照题目要求产生随机数据
#include <bits/stdc++.h>
using namespace std;
int main(){
freopen("data.in", "w", stdout);
srand(time(NULL));
long long n = rand()%100000 + 1;
long long m = rand()%n + 1;
printf("%lld %lld\n", n, m);
for(int i = 1; i <= n; i++) printf("%lld ", 1ll*rand()%100000000);
printf("\n");
return 0;
}
记事本写 对拍.bat(后缀名改成.bat!!!)
:loop
@echo off
suiji.exe
AC.exe
check.exe
fc AC.out check.out
if not errorlevel 1 goto loop
pause
:end
原理
suiji.cpp 按照题目意思产生随机数据,我们保证暴力代码虽然速度慢但是答案一定正确,我们将产生的数据在2个程序中运行,进行比对。如果返回的结果相同:
如果不同,说明我们优化后的前缀和程序有问题:
没有未来的未来不是我想要的未来