使用教程:
my.cpp里放你自己的代码,编译成my.exe
std.cpp里放标程,编译成std.exe
推荐用dev-c++,单文件编译方便然后自己修改rand.cpp数据生成器
按照题目格式输出一组数据
例如题目格式是,T组数据,每组数据一个n,一个m,然后n个1~m的整数
你就这么写:
printf("1\n");
int n=10;
int m=random(1,20);
printf("%d %d\n",n,m);
for(int i=0 ; i<n ; ++i)
{
printf(" %d ",random(0,m));
}
printf("\n");
数据量能小则小,方便调试。然后编译成rand.exe
最后运行 循环随机对拍.bat等待结果即可,对不上会自动暂停
关于对拍程序的写法原理:https://blog.youkuaiyun.com/wlx65003/article/details/51149196
rand.cpp
#include<bits/stdc++.h> using namespace std; #define random(a,b) ((a)+rand()%((b)-(a)+1)) stringstream ss; int main( int argc, char *argv[] ) { int seed=time(NULL); if(argc) { ss.clear(); ss<<argv[1]; ss>>seed; } srand(seed); //以上为随机数初始化,请勿修改 //random(a,b)生成[a,b]的随机整数 //以下写你自己的数据生成代码 printf("1\n"); int n=10; int m=random(1,20); printf("%d %d\n",n,m); for(int i=0 ; i<n ; ++i) { printf(" %d ",random(0,m)); } printf("\n"); return 0; }
my.cpp和std.cpp就放两个正常的程序,一个是自己写的,一个是正确的/暴力的
文件操作都不用加,后面的批处理会做的
这里给个示例
std.cpp
///这里是先把数对应到数组里,这样我们就可以知道哪里有空缺了,然后如果想到刘汝佳的计算前N项和的累加值的办法就会想到计算到这步要的0 ///只需在脑子里想一想这个题的模型,很容易想到暴力,因为序列是连续的必属于其中一段,暴力左端点,二分右端点。 #include<stdio.h> #include<string.h> int a[110100],b[110100]; int erfen(int l,int r,int zero){ int k=b[l-1]; while(l<r){ int mid=(l+r)>>1; if(b[mid]>k+zero){///如果比要找的值大的话,那我就往下找 r=mid; } else{///否则相等或小于我们找下一个,相等找下个的目的是找的不消耗的最长的,这样我们就会找到第一个大于找到的,我们减一, l=mid+1;///不过有的时候会找到末尾没找完,所以我们比较是否大于,如大于减一,这样就全面了 } } if(b[l]-k>zero) l--; return l; } int main() { int t,n,m,temp,zero; scanf("%d",&t); while(t--){ zero=0; scanf("%d%d",&n,&m); memset(a,0,sizeof(a)); for(int i=0;i<n;i++){ scanf("%d",&temp); if(temp==0) zero++; else a[temp]=1; } memset(b,0,sizeof(b)); for(int i=1;i<=m;i++){ b[i]=b[i-1]+(!a[i]); } int maxn=0; for(int i=1;i<=m;i++){ if(erfen(i,m,zero)-i+1>maxn) maxn=erfen(i,m,zero)-i+1; } printf("%d\n",maxn); } }
my.cpp
#include<iostream> #include<algorithm> #include<string> #include<map>//int dx[4]={0,0,-1,1};int dy[4]={-1,1,0,0}; #include<set>//int gcd(int a,int b){return b?gcd(b,a%b):a;} #include<vector> #include<cmath> #include<stack> #include<string.h> #include<stdlib.h> #include<cstdio> using namespace std; vector<int> v; int main(){ int t; scanf("%d",&t); while(t--){ v.clear(); int n,m,p=0; scanf("%d%d",&n,&m); int l=0,r=n; for(int i=0;i<n;++i){ int a; scanf("%d",&a); if(a==0) p++; else v.push_back(a); } if(p==n){ cout<<min(m,p)<<endl; continue; } sort(v.begin(),v.end()); n=unique(v.begin(),v.end())-v.begin(); int mid; int ans; while(l<=r){ mid=(l+r)/2; int a=0,b=0; if(min(m,p+1)>=mid){ l=mid+1; ans=mid; continue; } int u=0; for(int i=1;i<n;++i){ if((v[b]-v[a]+1)-(b-a+1)>p){ a++; continue; } if((v[b+1]-v[a]+1)-((b+1)-a+1)>p){ a++; b++; continue; } b++; int ss=p-((v[b]-v[a]+1)-(b-a+1)); int sss=min(m,ss+(v[b]-v[a]+1)); if(sss>=mid){ u=1; l=mid+1; ans=mid; break; } } if(u==0) r=mid-1; } cout<<ans<<endl; } return 0; }
编译产生exe.bat
用来把之前的my.cpp,std.cpp,rand.cpp批量编译产生exe
@echo off setlocal enabledelayedexpansion %扩展本地环境变量延迟% for %%i in (*.cpp) do ( set var=%%i echo compiling %%i ~~~~ g++ %%i -o !var:~0,-4! -std=c++11 )
单次对拍
@echo off rand.exe>data.in std.exe<data.in>std.out my.exe<data.in>my.out fc std.out my.out pause
循环对拍
@echo off :loop rand.exe %random% > data.in std.exe < data.in > std.out my.exe < data.in > my.out fc my.out std.out if not errorlevel 1 goto loop pause goto loop