题解 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;
} 
posted @ 2020-04-29 13:08  Ciciiiii  阅读(115)  评论(0)    收藏  举报