题解 CF1315C 【Restoring Permutation】
Solution:
贪心即可,用\(used\)数组记忆一个数是否被用过。
由于\(a_i\)和\(a_{i+1}\)的顺序不影响答案,所以不妨设\(a_i\)和\(a_{i+1}\)中的较小数为\(a_i\)。
显然为了在后面不冲突,\(a_{i+1}\)要选择只比\(a_i\)大一点且未被选过的数,如果没有这样的数,说明构造不出\(a\)数组,输出-1
具体见代码
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
inline int read(){
int f=1,res=0;char c=getchar();
while(c<'0'||c>'9') {if(c=='-')f=-1;c=getchar();}
while(c>='0'&&c<='9'){res=res*10+c-'0',c=getchar();}
return f*res;
}
int t,n,b[1001],a[1001];
bool used[1001],f;
void init(){
n=read();
memset(used,0,sizeof(used));
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));//初始化
for(int i=1;i<=n;i++){
b[i]=read();
used[b[i]]=1;//b[i]已经被用了
}
int cnt=0;//cnt记录a数组现在要选什么
for(int i=1;i<=n;i++){
a[++cnt]=b[i];//因为b[i]为a[cnt],a[cnt+1]中的较小数,又设a[cnt]<[cnt+1]
f=0;//是否存在数可以成为a[cnt+1]
for(int j=a[cnt]+1;j<=2*n;j++)
if(!used[j]) {
a[++cnt]=j,used[j]=1,f=1;break;//记录
}
if(f==0){//没有数可以
puts("-1");
return ;
}
}
for(int i=1;i<=cnt;i++) printf("%d ",a[i]);
printf("\n");
return ;
}
int main(){
t=read();
while(t--) init();
return 0;
}