PAT--Hashing - Hard Version (30)

来源:互联网 发布:mac 版本不支持os银联 编辑:程序博客网 时间:2024/05/22 03:04

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

哈哈,有一个样例可能是当在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<stdio.h>#include<queue>#include<vector>#include<map>using namespace std;#define N 1005priority_queue<int,vector<int>,greater<int> > pq;//优先队列,用以输出可以输出的最小值vector<int> v[N];//记录图map<int,int> 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<m;i++){//输入scanf("%d",&h[i]);//reserve[h[i]]=i;reserve.insert(pair<int,int>(h[i],i));}for(i=0;i<m;i++){//记录图和入度if(h[i]<0){indeg[i]=-1;continue;}indeg[i]=0;nowsite=i;presite=h[i]%m;if(nowsite!=presite){while(presite!=nowsite){v[presite].push_back(nowsite);presite=(presite+1)%m;indeg[nowsite]++;}}else{pq.push(h[i]);indeg[i]=-1;}}bool flag=true;while(!pq.empty()){temp=pq.top();pq.pop();temp=reserve[temp];for(i=0;i<v[temp].size();i++){//杀掉temp,其指向的点入度减一indeg[v[temp][i]]--;}for(i=0;i<m;i++){//入度为0,入队if(indeg[i]==0){pq.push(h[i]);indeg[i]--;}}if(flag){//如果是第一个数,前面不加空格printf("%d",h[temp]);flag=false;}else{printf(" %d",h[temp]);}}return 0;}

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

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

#include<stdio.h>#include<time.h>#include<memory.h>#include<stdlib.h>#define N 100000int 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<n;i++){temp=rand()%N;while(number[temp]==1){temp=rand()%N;}//printf("%d ",temp);number[temp]=1;sit=temp%m;while(hash[sit]!=-1){sit=(sit+1)%m;}hash[sit]=temp;}//puts("");for(i=0;i<m;i++){fprintf(fp,"%d ",hash[i]);}fprintf(fp,"\n");}return 0;}




0 0
原创粉丝点击