PAT 09-散列3. Hashing - Hard Version (30)

来源:互联网 发布:thinkphp分销商城源码 编辑:程序博客网 时间:2024/05/21 20:28

题目链接:

Hashing-Hard Version




解题思路:

暴力,首先根据题目要求将所有给出节点按字典序(从小到大)排列

循环S(节点总数)次,每次通过遍历数组找到一个未出现过的,且满足条件:只能出现在现有位置上(本可出现在之前位置,但被其他节点占据)的节点

输出节点的值 并标记为出现过即可得到答案





代码:

#include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#define M 1005using namespace std;struct node{    int d;    int pos;    int value;    int used;} Node[M];int vis[M];int n;int cmp(node a,node b){    return a.value<b.value;}int OK(int loc){    int mod=Node[loc].value%n;    if(Node[loc].d==0&&vis[mod]==0)    {        vis[mod]=1;        return 1;    }    else    {        for(int i=mod; i!=Node[loc].pos; i=(i+1)%n)        {            if(!vis[i])                return 0;        }        vis[Node[loc].pos]=1;        return 1;    }}int main(){    int s;    scanf("%d",&n);    s=0;    int a,mod;    for(int i=0; i<n; i++)    {        vis[i]=0;        scanf("%d",&a);        if(a!=-1)        {            mod=a%n;            if(mod<i)                Node[s].d=i-mod;            else                          //注意mod>i的情况                 Node[s].d=i+n-mod;            Node[s].pos=i;            Node[s].used=0;            Node[s++].value=a;        }    }    sort(Node,Node+s,cmp);    for(int i=0; i<s; i++)    {        for(int j=0; j<s; j++)            if(!Node[j].used&&OK(j))            {                Node[j].used=1;                if(i==0)                    cout<<Node[j].value;                else                    cout<<' '<<Node[j].value;                break;            }    }    cout<<endl;    return 0;}


0 0