hihoCoder 每日一练 #1748:最小排列

最小排列

提交网站:https://hihocoder.com/problemset/problem/1748

时间限制:10000ms

单点时限:1000ms

内存限制:256MB


描述

给定一个长度为m的序列b[1..m],再给定一个n,求一个字典序最小的1~n的排列A,使得bA的子序列。

一个序列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;
}

  

猜你喜欢

转载自www.cnblogs.com/yunners/p/12720716.html