zoukankan      html  css  js  c++  java
  • hdu6468 zyb的面试

    首发于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
    

    分析:通过模拟样例,可以发现这个“字典序”可以构造成一个十叉树(如下图)。

    于是,问题就转换成了从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
    ",ans);
    	}
    	return 0;
    }
    
  • 相关阅读:
    page1
    CodeForces
    树、递归————二叉树的所有路径
    树(未完)
    树、递归、遍历————二叉搜索树的最近公共祖先
    树、递归————翻转二叉树
    树、递归————路径总和
    树、递归、广度优先搜索(BFS)————二叉树的最小深度
    树————平衡二叉树
    平衡二叉树AVL
  • 原文地址:https://www.cnblogs.com/juruo-zzt/p/12255178.html
Copyright © 2011-2022 走看看