求助随机贪心
  • 板块P1650 田忌赛马
  • 楼主P31pr
  • 当前回复4
  • 已保存回复4
  • 发布时间2021/1/20 13:38
  • 上次更新2023/11/5 04:38:28
查看原帖
求助随机贪心
315191
P31pr楼主2021/1/20 13:38

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,观察其他测试点的错误信息可以发现这样的情况不止一个 ¿

2021/1/20 13:38
加载中...