码迷,mamicode.com
首页 > 其他好文 > 详细

hdu6468 zyb的面试

时间:2020-02-03 13:59:35      阅读:80      评论:0      收藏:0      [点我收藏+]

标签:term   ret   hdu   names   log   print   ++   amp   image   

首发于my CSDN blog


题目链接

Problem Description
今天zyb参加一场面试,面试官听说zyb是ACMer之后立马抛出了一道算法题给zyb:
有一个序列,是 \(1\)\(n\) 的一种排列,排列的顺序是字典序小的在前,那么第k个数字是什么?
例如 \(n=15,k=7\) , 排列顺序为1, 10, 11, 12, 13, 14, 15, 2, 3, 4, 5, 6, 7, 8, 9;那么第7个数字就是15.
那么,如果你处在zyb的场景下,你能解决这个问题吗?

Input
\(T\) 组样例( \(T \le 100\) )
两个整数 \(n\)\(k\) ( \(1 \le n \le 10^{6}, 1 \le k \le n\) ), \(n\)\(k\) 代表的含义如上文

Output
输出 \(1-n\) 之中字典序第 \(k\) 小的数字

Sample Input
1
15 7

Sample Output
15


分析:一开始以为是一道找规律的题,在纸上划了半天硬是没找出半点规律。看这个题面又不像是dp的题,于是,就只能是dfs。
通过模拟样例,可以发现这个“字典序”可以构造成一个十叉树(如下图)。

技术图片
于是,问题就转换成了从0开始dfs遍历,遍历到的第k个节点所表示的数是什么(当然,不算0)。
但是,我们并不需要建树。观察得出,树中任何一个非叶子节点s的第i个子节点上的数都是s上的数*10+i(比较绕口,建议多看几遍,理解一下),我们无需遍历点,而是通过dfs搜索点上的数。找到第k个数的时候,就结束遍历,输出答案。
当然,这只是其中一种理解方式,还有其他的理解方式,这里不再赘述。
code:

#include<iostream>
#include<cstdio> 
using namespace std;
int n,k,ans;
int cnt=0; //初始值记录数量 
void dfs(int s,int flag) //s:当前的值 d:已构造出的数的数量 flag:标记是否是开头(如果是开头则数字不能为零) 
{
    if(s) //如果不为零再计数(在main函数中是这样调用的:dfs(0,1),所以要加这个特判) 
    {
        cnt++;
        if(cnt==k) {ans=s;return;} //找到这个数,返回 
    }
    for(int i=flag;i<=9;i++) //如果是开头,则从1开始,否则从0开始 
    {
        int ss=(s<<1)+(s<<3)+i; //等同于ss=s*10+i 
        if(ss<=n)
        {
            dfs(ss,0); //在区间[1,n]内,继续搜索 
            if(ans) return;
        }
        else return;
    }
}
int read() //快读 
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
    return x*f;
}
int main()
{
    int T=read();
    while(T--)
    {
        ans=0,cnt=0;
        n=read(),k=read();
        dfs(0,1);
        printf("%d\n",ans);
    }
    return 0;
}

hdu6468 zyb的面试

标签:term   ret   hdu   names   log   print   ++   amp   image   

原文地址:https://www.cnblogs.com/juruo-zzt/p/12255178.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!