题目:
简单错误答案:
预处理将数字转换成字符串,然后每次提取对应字符串排序,利用下标得到答案,然后 MLE。
这次我每次都单独利用to_string 函数暴力转换然后排序,利用下标得到答案,然后 TLE。
正确答案:
将数据范围全部转化成一颗十叉树,深度优先遍历情况下第 K 个搜到的就是答案。
下图搜索自其他帖子:
反思:你弱爆了
#include<iostream> #include<algorithm> #include<cstdio> #include<cmath> #include<stack> #include<queue> #include<map> #include<list> #include<string> #include<ctype.h> #include<cstring> #include<set> #include<vector> #define ll long long #define mp make_pair #define inf 0x3f3f3f3f #define pb push_back #define PI 3.14159265358979323846 using namespace std; const int maxn = 2e5 + 100; void Fast() { ios::sync_with_stdio(false);cin.tie(0);cout.tie(0); } bool ok;int n,k; int num = 0; void dfs(int x) // 将数据形象成一颗是叉树,问题就简化成了深搜中第几次搜索到的问题 { if(ok) return ; // ok == 1 说明已经找到答案,没必要继续搜索 num++; if(num == k) { printf("%d\n",x); ok = true;return ; } for(int i = 0;i <= 9;i++){ int cnt = x * 10 + i; if(cnt > n) return ; dfs(cnt); } } int main() { int t;scanf("%d",&t); while(t--){ scanf("%d%d",&n,&k); ok = false;num = 0; for(int i = 1; i <= 9;i++) dfs(i); } return 0; }