最小排列
提交网站:https://hihocoder.com/problemset/problem/1748
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
描述
给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得b是A的子序列。
一个序列a是序列c的子序列,当且仅当a可以由c中删除任意数量的数获得。
输入
第一行两个正整数n,m. 1 ≤ m ≤ n ≤ 105
接下来m行,第i行一个数表示b[i]
输出
输出n行,第i行一个数表示A[i]
保证答案一定存在
样例输入
5 3
1
4
2
样例输出
1
3
4
2
5
代码如下:
#include<stdio.h> main() { int n,m; scanf("%d%d",&n,&m); int data[m],map[n]; int i,j,k=0; for(i=0;i<m;i++) scanf("%d",&data[i]); for(i=1;i<=n;i++)//将未出现的数存入map数组 { for(j=0;j<m;j++) { if(i==data[j]) break; } if(j==m) map[k++]=i; } for(i=0,j=0;i<m&&j<k;) { if(data[i]<map[j]) printf("%d\n",data[i++]); else printf("%d\n",map[j++]); } while(i<m) printf("%d\n",data[i++]); while(j<k) printf("%d\n",map[j++]); return 0; }