对拍 - 详解

新知识涌入

用处: 检验程序正确性

例 题:

点击进入题面

这是一道前缀和的模板题

我们有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个程序中运行,进行比对。如果返回的结果相同:

如果不同,说明我们优化后的前缀和程序有问题:

posted @ 2020-11-05 20:41  LT-Y  阅读(110)  评论(0编辑  收藏  举报