Java教程

随机化数组

本文主要是介绍随机化数组,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

随机化数组的方法

来源于Problem - B - Codeforces (Unofficial mirror site, accelerated for Chinese users)

当时用随机化数组的方法过了,记录一下,以后可能用到

#include<bits/stdc++.h>
using namespace std;
struct tnode{
	int a[5];
}e[500050];
int zhan[10010],tot,zhan1[100010],cnt,bj[100010],nb[100010],nex[100010];
int cmp(int x,int y)
{
	int ans=0;
	for(int i=0;i<5;i++)
	if(e[x].a[i]<e[y].a[i])ans++;
	if(ans>=3)return true;
	else return false;
}
int main()
{
	srand((int)time(0));
//	freopen("std.in","r",stdin);
	int t;
	cin>>t;
	while(t--)
	{
		tot=0;cnt=0;
		int n;
		cin>>n;
		for(int i=1;i<=n;i++)
		{
			scanf("%d%d%d%d%d",&e[i].a[0],&e[i].a[1],&e[i].a[2],&e[i].a[3],&e[i].a[4]);
			bj[i]=0;
			nb[i]=0;
			nex[i]=i+1;
		}
		nex[n]=1;
		if(n==1)
		{
			cout<<1<<"\n";continue;
		}
		for(int t=1;t<=n;t++)
		{
			int maxn=1ll*rand()*rand()%n+1;
			while(nb[maxn]==1)
			{
//				int to=nex[maxn];
//				nex[maxn]=nex[to];
				maxn=nex[maxn];
			}
			nb[maxn]=1;
			if(!bj[maxn])
			for(int i=1;i<=n;i++)
			if(i!=maxn){
				if(cmp(maxn,i))
				{
					if(bj[i]!=1)
					{
						bj[i]=1;nb[i]=1;t++;
					}
				}
				else bj[maxn]=1;
			}
			if(t==n)break;
			for(int l=1,r;l<=n;l=r+1)
			{
				while(nb[l]!=0&&l<=n)l++;
				if(l>n)break;
				r=l;
				while(nb[r]==1&&r<=n)r++;
				if(r>n)
				{
					for(int j=l;j<=r;j++)
					nex[j]=nex[1];
				}else
				for(int j=l;j<=r;j++)
				nex[j]=nex[r];
			}
		}
		int maxn=-1;
		for(int i=1;i<=n;i++)
		if(!bj[i])maxn=i;
		cout<<maxn<<"\n";
//		for(int i=0;i<5;i++)
//		{
//			int bj=0,maxn=50100;
//			for(int j=1;j<=n;j++)
//			{
//				if(maxn>e[j].a[i])
//				{
//					bj=j;maxn=e[j].a[i];
//				}
//			}
//			zhan[++tot]=bj;
//		}
//		sort(zhan+1,zhan+tot+1);
//		tot=unique(zhan+1,zhan+tot+1)-zhan-1;
////		for(int i=1;i<=tot;i++)
////		cout<<zhan[i]<<" ";
////		cout<<"\n";
//		if(tot==1)
//		{
//			cout<<zhan[tot]<<"\n";continue;
//		}
//		int ans=0;
//		for(int i=1;i<=tot;i++)
//		{
//			int bj=0;
//			for(int j=1;j<=tot;j++)
//			if(j!=i){
//				if(!cmp(zhan[i],zhan[j]))bj=1;
//			}
//			if(!bj)
//			{
//				ans=1;
//				cout<<zhan[i]<<"\n";break;
//			}
//		}
//		if(!ans)
//		cout<<"-1"<<"\n";
	}
	return 0;
}
这篇关于随机化数组的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!