RT,本蒟蒻试图通过随机乱搞A了这题,但是为何我得到了比标准答案更大的答案?? 以下是代码:
#include<cstdio>
#include<cstring>
#include<algorithm>
const int N=2005,T=150;
int n,t[N],q[N];
bool vist[N],visq[N];
int win,tie,lose;
int ans;
inline int max(int x,int y){return x>y?x:y;}
int solve1()//有平局
{
win=tie=lose=0;
memset(vist,0,sizeof(vist));
memset(visq,0,sizeof(visq));
// std::random_shuffle(q+1,q+n+1);
std::random_shuffle(t+1,t+n+1);//答案与大小顺序有关,随机打乱
for(int i=1;i<=n;++i)
{
for(int j=n;j>=1;--j)
{
if(visq[j]) continue;
if(t[i]>q[j])
{
visq[j]=vist[i]=true;
win++;
// printf("%d beat %d\n",i,j);
break;
}
}
}
for(int i=1;i<=n;++i)
{
if(vist[i]) continue;
for(int j=n;j>=1;--j)
{
if(visq[j]) continue;
if(t[i]==q[j])
{
visq[i]=vist[j]=true;
tie++;
break;
}
}
}
for(int i=1;i<=n;++i)
if(!visq[i]) lose++;
return 200*(win-lose);
}
int solve2()//无平局
{
win=tie=lose=0;
memset(vist,0,sizeof(vist));
memset(visq,0,sizeof(visq));
// std::random_shuffle(t+1,t+n+1);
for(int i=n;i>=1;--i)
{
for(int j=1;j<=n;++j)
{
if(visq[j]) continue;
if(t[i]>q[j])
{
vist[i]=visq[j]=true;
win++;
break;
}
}
}
return (win*2-n)*200;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",t+i);
for(int i=1;i<=n;++i)
scanf("%d",q+i);
std::sort(q+1,q+n+1);
for(int i=1;i<=T;++i)
{
ans=max(ans,max(solve1(),solve2()));
}
printf("%d\n",ans);
return 0;
}
我下载了测试点2的数据,发现自己跑出来362200,而标答是361800,观察其他测试点的错误信息可以发现这样的情况不止一个 ¿