题目链接:
解题思路:
暴力,首先根据题目要求将所有给出节点按字典序(从小到大)排列
循环S(节点总数)次,每次通过遍历数组找到一个未出现过的,且满足条件:只能出现在现有位置上(本可出现在之前位置,但被其他节点占据)的节点
输出节点的值 并标记为出现过即可得到答案
代码:
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #define M 1005 using 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; }
时间: 2024-11-13 09:42:39