题目传送门:点我
题意:有1-n个数,现在剩下m个数字,请你往m个数字里把其他n-m个插进去,使得字典序最小,并输出这个插好的的序列。
思路很明显,就是每次都在可以选的数字里选最小的插,如果比剩的m的大就插这m个里的,然后继续。但是我一直T……因为我想的是在这个过程中用一个数组c[]来存储放好的新数列,最后输出c[],不过其实只要一边排一边输出就好了,不需要额外的花销。
后来看到题解,用队列会更简单。
#include <bits/stdc++.h>
using namespace std;
#define MAX_N 100010
int n, //最初的数量
m, //剩余的数量
acnt;
int origin[MAX_N], remain[MAX_N], output[MAX_N];
int main()
{
scanf("%d %d", &n, &m);
for(int i = 1;i <= m;i++)
{
scanf("%d", &remain[i]);
origin[remain[i]] = 1;//标记i这个数字已经用过
}
int rcnt = 1, acnt = 1, ocnt = 0;
while(ocnt < n)
{
if(remain[rcnt] > acnt || rcnt == m+1)
{
if(origin[acnt])
acnt++;
else
{
printf("%d\n", acnt);
acnt++;
ocnt++;
}
}
else
{
if(rcnt == m+1)
continue;
printf("%d\n", remain[rcnt]);
if(remain[rcnt] == acnt)
acnt++;
rcnt++;
ocnt++;
}
}
//for(int i = 1;i <= n;i++)
//printf("%d\n", output[i]);
return 0;
}