[对拍模板]
今天又是军训(难受)
照例晚上跑到了电脑室
今天学了对拍
记录一下
先随便口胡了一个题: 求一个数列中连续的数的最大和
先写一个暴力程序(要保证正确)
#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; }
再写一个算法程序(验证正确性)
#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; }
再写一个生成数据的程序 用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; }
再写一个用来比对的程序
#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; }
然后运行就可以了
对拍还是很有用的一个技巧的
比赛场上很重要