题目:
思路:
对于每次订单找它的序号
如果序号没有被用过:
那么就将该位置的序号
标记为下一能使用的位置的序号
(因为题目的要求如果当前序号不可用
那么采用下一没有被使用过的序号)
如果序号被使用过:
直接找到它的头序号
进行取头序号的操作
并且注意每次的寻找
都需要在每次的递归的每个位置上记录下的头老大的位置
这样可以帮忙优化代码运行的时间
代码详解:
#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:人生到处知何似,应似飞鸿踏雪泥。