小白进阶之路-HDU-6468-思维题

题目:

简单错误答案:

  预处理将数字转换成字符串,然后每次提取对应字符串排序,利用下标得到答案,然后 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;
}

猜你喜欢

转载自www.cnblogs.com/Wise-XiaoWei4/p/12916776.html