Missing Gnomes | 队列 | 思维

题目传送门:点我
题意:有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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值