http://acm.hdu.edu.cn/showproblem.php?pid=6468

题意

有一个序列,是1到n的一种排列,排列的顺序是字典序小的在前,那么第k个数字是什么?(\(1 \leq n \leq 10^6,1 \leq k \leq n,多组T\leq 100\))

题解1

  • 假如剪枝好的话,每次最多搜1e6,这样总共1e8,能过
  • dfs序>=k剪掉,num>n剪掉
#include<bits/stdc++.h>

using namespace std;
int dfn,n,k,ans,T;
void dfs(int num){
if(dfn>=k)return;
dfn++;
//cout<<num<<" "<<dfn<<endl;
if(dfn==k){ans=num;return;}
int l=(!num?1:0);
for(int i=l;i<=9;i++){
if(num*10+i>n)return; //continue就超时了
dfs(num*10+i);
}
}
int main(){
cin>>T;
while(T--){
dfn=-1;
scanf("%d%d",&n,&k);
dfs(0);
printf("%d\n",ans);
}
}

题解2

https://www.twblogs.net/a/5c92e1f9bd9eee35cd6ba3b7/zh-cn

  • 预处理出所有字符串,排序,O(6nlog(6*n))
#include <iostream>
#include <algorithm>
#include <cstdlib>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <deque>
#include <stack>
using namespace std;
typedef long long ll;
const int MAX=1e6;
const int MM=192600817;
struct A
{
ll k;
char s[8];
}a[MAX+1];
bool cmp(struct A p,struct A q)
{
return strcmp(p.s,q.s)<0;
}
int main()
{
ll T,n,k,i,j;
for(i=1;i<=MAX;i++)
{
a[i].k=i;
ll t=i,e=0,m;
while(t)
{
a[i].s[e]=(t%10)+'0';
t/=10;
e++;
}
for(j=0;j<e/2;j++)
{
char tt;
tt=a[i].s[j];
a[i].s[j]=a[i].s[e-j-1];
a[i].s[e-j-1]=tt;
}
}
sort(a+1,a+MAX+1,cmp);
//cout<<a[1000].s<<endl;
cin>>T;
while(T--)
{
cin>>n>>k;
i=1;
for(i=1;i<=MAX;i++)
{
if(a[i].k>n)
continue;
else
k--;
if(k==0)
break;
}
cout<<a[i].k<<endl;
}
return 0;
}

题解3

https://zeng1998.github.io/2019/03/16/hdu6468——zyb的面试/

#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ll;
ll solve(ll n,ll m){
//考虑一颗完全10叉树,树的所有节点就是1-n,要求的就是前序遍历的第m个节点
//m是可以走的步数
ll i=1;
m--;
while(m!=0){
//计算i到i+1的字典序中间相隔的个数
ll s=i,e=i+1;
ll num=0;
//防止越界
while(s<=n){
//计算每一层相差的个数
//n+1: 比如20-29其实是10个,而e就不用+1,因为e在这里表示30(40/50...)
num+=min(n+1,e)-s;
s*=10;
e*=10;
}
if(m<num){
//向下
i*=10;
//走一步
m--;
}else{
//向右
i++;
//对前序遍历来说,走了num步
m-=num;
}
}
return i;
}
int t;
ll n, m;
int main() {
scanf("%d",&t);
while (t--){
scanf("%lld%lld",&n,&m);
printf("%lld\n",solve(n,m));
}
return 0;
}

hdu6468 dfs剪枝 or char数组 or 构造的更多相关文章

  1. Codeforces Round #225 (Div. 1) C. Propagating tree dfs序+树状数组

    C. Propagating tree Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest/383/p ...

  2. BZOJ 2434: [Noi2011]阿狸的打字机( AC自动机 + DFS序 + 树状数组 )

    一个串a在b中出现, 那么a是b的某些前缀的后缀, 所以搞出AC自动机, 按fail反向建树, 然后查询(x, y)就是y的子树中有多少是x的前缀. 离线, 对AC自动机DFS一遍, 用dfs序+树状 ...

  3. 【bzoj3881】[Coci2015]Divljak AC自动机+树链的并+DFS序+树状数组

    题目描述 Alice有n个字符串S_1,S_2...S_n,Bob有一个字符串集合T,一开始集合是空的. 接下来会发生q个操作,操作有两种形式: “1 P”,Bob往自己的集合里添加了一个字符串P. ...

  4. [BZOJ1103][POI2007]大都市meg dfs序+树状数组

    Description 在经济全球化浪潮的影响下,习惯于漫步在清晨的乡间小路的邮递员Blue Mary也开始骑着摩托车传递邮件了.不过,她经常回忆起以前在乡间漫步的情景.昔日,乡下有依次编号为1..n ...

  5. 【BZOJ】2819: Nim(树链剖分 / lca+dfs序+树状数组)

    题目 传送门:QWQ 分析 先敲了个树链剖分,发现无法AC(其实是自己弱,懒得debug.手写栈) 然后去学了学正解 核心挺好理解的,$ query(a) $是$ a $到根的异或和. 答案就是$ l ...

  6. 【bzoj3779】重组病毒 LCT+树上倍增+DFS序+树状数组区间修改区间查询

    题目描述 给出一棵n个节点的树,每一个节点开始有一个互不相同的颜色,初始根节点为1. 定义一次感染为:将指定的一个节点到根的链上的所有节点染成一种新的颜色,代价为这条链上不同颜色的数目. 现有m次操作 ...

  7. Black And White(DFS+剪枝)

    Black And White Time Limit: 2000/2000 MS (Java/Others)    Memory Limit: 512000/512000 K (Java/Others ...

  8. 【bzoj2819】Nim DFS序+树状数组+倍增LCA

    题目描述 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略 ...

  9. HDU5113【DFS+剪枝】

    题意: n*m的矩阵 k种颜色 每种颜色有c[i]个 上下左右相邻的格子不能一样的颜色 问你有没有一种染色方法,有的话输出方案. 思路: 暴搜啊,n,m都才5,做完以后大哥的剪枝是奇偶剪枝,其实画完图 ...

随机推荐

  1. CSP2019 S2滚粗记

    最好分数:100+20+10+64+64+55 最坏分数:100+20+10+64+36+55 咕咕数据分数:100+25+10+64+60+55 CCF官方: 100+35+10+64+36+55= ...

  2. linux--新装机图形化界面遇到的问题

    1 许可证信息 q 退出 c 继续 r 刷新 按以下顺序正确输入即可: 1  ------  2 -----  q  -----  yes

  3. 用sticky.js实现头部导航栏固定

    在页面中,如果页面长度过大,滑动页面时,头部导航栏则会跟着划走. 我的头部导航栏代码为: <div class="headbar"> <center class= ...

  4. 失败zero

    1127 系统玩崩溃了 分区助手调整c盘,导致自动进入快速启动然后疯狂boot网卡检测?还有测试中心? 查找错误initialization and establishing link,结论是bios ...

  5. WPF 使用动画设置特殊值的方法

    例如设置Visibility属性时: 第一种方式: <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIEleme ...

  6. What is Java virtual machine?

    Java Virtual Machine (JVM) is a specification that provides runtime environment in which java  bytec ...

  7. oracle学习笔记(十五) PL/SQL语法结构以及使用

    PL/SQL 简介 PL/SQL 是过程语言(Procedural Language)与结构化查询语言(SQL)结合而成的编程语言. PL/SQL 是对 SQL 的扩展. 支持多种数据类型,如大对象和 ...

  8. 使用CAD快速看图如何将图纸打印和预览?

    有相关CAD工作经验的小伙伴们都知道,绘制完CAD图纸后是需要借助CAD看图工具来进行查看图纸的,其实CAD快速看图中不仅能够对图纸进行查看,还能够将CAD图纸进行打印出来.但是有很多的伙伴不知道要怎 ...

  9. Vue笔记--通过自定义指令实现按钮操作权限

    经常做中后台系统,此类系统的权限是比较重要,拿自己做过的一些项目做个笔记. Vue实现的中后台管理系统.按钮操作权限的空置一般都是通过自定义指令Vue.directive. <el-button ...

  10. Linux 查找目录下大于*M的文件

    1. 查找指定文件夹下等于1M的文件 find ./ -size 1M | wc -l 2. 查找指定文件夹下大于1M的文件 find ./target_path -size +1M | wc -l