0
点赞
收藏
分享

微信扫一扫

订单编号问题

我是芄兰 2022-03-11 阅读 67

题目:


思路:

对于每次订单找它的序号

如果序号没有被用过:

那么就将该位置的序号

标记为下一能使用的位置的序号

(因为题目的要求如果当前序号不可用

那么采用下一没有被使用过的序号)

如果序号被使用过:

直接找到它的头序号

进行取头序号的操作

并且注意每次的寻找

都需要在每次的递归的每个位置上记录下的头老大的位置

这样可以帮忙优化代码运行的时间

代码详解:

#include<stdio.h>
#include<iostream>
#include<map>
using namespace std;
#include <unordered_map>
typedef long long ll;

unordered_map<ll, ll> a;
ll find(ll x) {
    if (!a.count(x)) return x;//如果从来没有用过该序号
    a[x] = find(a[x]);//将该位置的头序号标记标记为它的最终头序号
    return a[x];//找到头序号
}

int main() {
    int n; cin >> n;
    for (int i = 0; i < n; i++) {
        ll t; 
        scanf("%lld", &t);//取要找的序号
        t = find(t);//找到序号的头序号
        printf("%lld ", t);//输出该序号
        a[t] = t + 1;//将该序号的位置上的数 标记为下一个序号的位置
    }
}

PS:人生到处知何似,应似飞鸿踏雪泥。

举报

相关推荐

0 条评论