[对拍模板]

今天又是军训(难受)

照例晚上跑到了电脑室

今天学了对拍

记录一下

先随便口胡了一个题: 求一个数列中连续的数的最大和

先写一个暴力程序(要保证正确)

#include<iostream>
#include<cstdio>
using namespace std;
long long  n,a[100000];
long long  ans,sum[100000];
int main()
{
    freopen("QWQ.in","r",stdin);
    freopen("QWQ.ans","w",stdout);
    cin >> n ;
    for(long long i = 1;i <= n; i++) cin>>a[i],sum[i] = sum[i-1] + a[i];
    for(long long i = 1; i<= n; i++)
    for(long long j = i-1; j >= 0; j--)
    {
        ans = max(ans,sum[i] - sum[j]);
    }
    cout << ans;
}
ans

再写一个算法程序(验证正确性)

#include<iostream>
#include<cstdio>
using namespace std;
long long minn=0x3f3f3f,n,a[1000000],sum[1000000],ans;
int main()
{
   freopen("QWQ.in","r",stdin);
   freopen("QWQ.out","w",stdout);
   scanf("%lld",&n);
   for(long long i = 1; i <= n ; i++)
   {
       scanf("%lld",&a[i]);
       sum[i] = sum[i-1] + a[i];    
   }    
   for(long long i = 0; i <= n; i++)
   {
          minn = min(minn,sum[i]);
          ans = max(ans,sum[i]-minn);
   }
   cout << ans;
} 
want

再写一个生成数据的程序 用rand()来生成

#include <bits/stdc++.h>
using namespace std;
int main()
{
    srand(time(0));
    freopen("QWQ.in","w",stdout);
    long long t = rand()%1000; 
    cout << t << endl;
    for(long long i = 1;i <= t ; i++)
    {
        if(rand()%1000<=t )printf("%d ",rand());
        else printf("%d ",-rand());    //生成负数的一个小技巧 
    } 
    return 0;
}
data

再写一个用来比对的程序

#include<iostream>
#include<cstdio>
#include<windows.h>
using namespace std;
int main()
{
   int t = 0;
   while(1)
   {
       system("data");//运行生成数据程序 
       system("ans");//运行暴力 
    system("want");//运行算法程序 
    if(system("fc QWQ.ans QWQ.out")) break;//比对 (fc是比较两个文件的意思)    
    cout<<endl<<++t;
   }    
    printf("error!");
    return 0;   
} 
test

然后运行就可以了

对拍还是很有用的一个技巧的

比赛场上很重要

原文地址:https://www.cnblogs.com/dixiao/p/13556172.html