给你一个数n和k

让你把1-----n字典序排列

求出第k个

t<100

n<1000000

题解:

首先我们可以通过n的字典序排序构造出一个10叉树

copy来自其他blog的图片

我们可以根据这个树 进行遍历

遍历有3种操作   *10     /10      +1

用dfs左序遍历也可以过 数据小

AC_code:

/*
Algorithm: 模拟  10叉树 
Author: anthony1314
Creat Time:
Time Complexity:
*/

#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
#include<set>
#include<stack>
#include<cstring>
#include<cstdio>
//#include<bits/stdc++.h>
#define ll long long
#define maxn 1005
#define mod 1e9 + 7
#define line printf("--------------");
using namespace std;

int main() {
	int t;
	cin >> t;
	while(t--) {
		int n, k;
		cin >> n >> k;
		int temp = 1;
		while(k > 1) {
			if(temp * 10 <= n) { //////  乘以10
				temp *= 10;
				k--;
			} else {
				if(temp + 1 <= n) {////////   加1
					while(temp % 10 == 9) {
						temp /= 10;
					}
					temp++;
					k--;
				} else {///////    除以10
					temp /= 10;
					while(temp % 10 == 9) {
						temp /= 10;
					}
					temp++;
					k--;
				}
			}
		}
		cout <<temp<< endl;
	}
	return 0;
}