PAT--Hashing - Hard Version (30)

首先说一下大家最关注的吧,你是不是有两个样例没过呢?

哈哈,有一个样例可能是当在m-1处遇到冲突是,将开始从0探测,另一个样例是我找了大半天才找出来的。废话不说,且看下例:

10
-1 -1 13442 17453 25364 10545 27094 17117 17228 13133

正确答案是:10545 13442 17117 17228 17453 25364 27094 13133

而我的答案是10545 13442 17117 17228 13133 17453 25364 27094

不难发现,我的问题在于认为a,b,c,d,e,f,g这些非负整数中,g只要出现在f后面即可。如果输出f,那么就可以输出g。但事实上,假设g和d是同余的(mod m)那么,g显然必须在d,e,f都输出之后才能输出。

好了,这是我遇到的问题,如果没有解决你的问题,请看最后,我写了一个生成数据的代码,你可以用这个代码生成几个数据,自己测一下

本来我是很不想用拓扑排序的,没办法,自己的算法失效了,还是拓扑排序咯。

这个图怎么建立,请参考:http://blog.sina.com.cn/s/blog_ce1b01420102vizs.html

#include
#include
#include
#include
using namespace std;

#define N 1005

priority_queue,greater > pq;//优先队列,用以输出可以输出的最小值
vector v[N];//记录图
map reserve;//记录某个数对应的下标

int main(){
	int m,b,temp;
	int h[N];
	int indeg[N];
	int presite,nowsite;
	scanf("%d",&m);
	int i,j,size=0;
	for(i=0;i(h[i],i));
		
	}
	for(i=0;i

生成数据的代码,可以借助这个调试哟!

注意,建议m取10,方便调试,你也可以改成其他值哒

#include
#include
#include
#include

#define N 100000

int number[N];
int hash[1005];
int main(){
	FILE *fp;
	fp=fopen("in2.txt","w");
	if(fp==NULL){
		puts("ERROR");
		return -1;
	}
	int num=50,i,j,m,temp,sit,n;
	srand((unsigned)time(NULL));
	//num控制测试总组数 
	while(num--){
		memset(hash,-1,1005*sizeof(int));
		memset(number,0,N*sizeof(int));
		//m控制 第一个数 ,建议取10,方便调试 
		//m=rand()%1000+1;
		m=10;
		fprintf(fp,"%d\n",m);
		n=1;
		if(m!=1)	n=rand()%(m/2)+(m/2)+1;
		for(i=0;i




你可能感兴趣的:(算法OJ)