hihoCoder 每日一练 #1748:最小排列
最小排列
提交网站: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;
}
登高而望。

浙公网安备 33010602011771号