对拍,以 POJ 3347 为例。
对拍方法如下:
//主函数代码 文件名任意
#include<iostream>
#include<windows.h>
using namespace std;
int main()
{
int t=200;
while(t--)
{
cout<<t<<endl;
system("random.exe > random.txt");
system("biaoda.exe < random.txt > biaoda.txt");
system("wode.exe < random.txt > wode.txt");
if(system("fc wode.txt biaoda.txt"))
{
//如果出现结果不同的情况,执行以下代码
//样例数据会存到random.txt中
cout<<t<<endl;
break;
}
}
}
//标答 文件名为 biaoda
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
typedef long long ll;
using namespace std;
const int N=100010;
int s[110],t[110];
int main()
{
int n;
//对拍时就别多组输入了
scanf("%d",&n);
//while(scanf("%d",&n)&&n)
//{
for(int i=1;i<=n;i++)
scanf("%d",&s[i]);
for(int i=1;i<=n;i++)
{
t[i]=s[i];
for(int j=1;j<i;j++)
{
t[i]=max(t[i],t[j]+2*min(s[j],s[i]));
}
}
for(int i=1;i<=n;i++)
{
int l=0,r=0;
for(int j=1;j<i;j++)
{
if(s[j]>s[i])
l=max(l,s[j]+s[i]-(t[i]-t[j]));
}
for(int j=i+1;j<=n;j++)
{
if(s[j]>s[i])
r=max(r,s[j]+s[i]-(t[j]-t[i]));
}
if(l+r<2*s[i])
printf("%d ",i);
}
printf("\n");
//}
return 0;
}
//我的代码,文件名为 wode
#include<iostream>
#include<iomanip>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstring>
typedef long long ll;
using namespace std;
const int N=100010;
double s[110],t[110];
int main()
{
int n;
//对拍时就别多组输入了
scanf("%d",&n);
//while(scanf("%d",&n)&&n)
//{
for(int i=1;i<=n;i++)
scanf("%lf",&s[i]);//s[i]为正方形边长的sqrt(2)倍
s[0]=0;t[0]=0;
double inf=0;
for(int i=1;i<=n;i++)
{
t[i]=s[i]/2;
for(int j=1;j<i;j++)
t[i]=max(t[i],t[j]+min(s[j],s[i]));
inf=max(inf ,t[i]+s[i]/2);
}
for(int i=1;i<=n;i++)
{
double l=inf,r=0;
for(int j=1;j<i;j++)
{
if(s[j]>s[i])
r=max(r,t[j]+s[j]/2);
}
for(int j=i+1;j<=n;j++)
{
if(s[j]>s[i])
l=min(l,max(t[j]-s[j]/2,double(0)));
}
/*
正确代码:
if(l<=t[i]-s[i]/2||r>=t[i]+s[i]/2||r>=l)
continue;
else
printf("%d ",i);
*/
if(r>=l)
continue;
else
printf("%d ",i);
}
printf("\n");
//}
return 0;
}
//随机数代码 名文件称为 random
#include<bits/stdc++.h>
#define mem(a,b) memset((a),b,sizeof(a))
typedef long long ll;
const int N=100010;
using namespace std;
int a[1000010];
int random(int n)
{
return (long long)rand()*rand()%n;
}
int main()
{
srand((unsigned)time(0));
int n=random(5)+1;
/*
尽管题目要求是n最大为50,但是我不想n太大,
太大的数据不容易找到错误,所以此处我让n最大为5
*/
int m=30;
for(int i=1;i<=n;i++)
{
a[i]=random(m+1);
if(a[i]==0)
a[i]++;
}
cout<<n<<endl;
for(int i=1;i<=n;i++)
cout<<a[i]<<" ";
return 0;
}