hdu6468(记忆化搜索)
zyb的面试
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)
Total Submission(s): 695 Accepted Submission(s): 254
有一个序列,是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的场景下,你能解决这个问题吗?
两个整数n和k(1<=n<=1e6,1<=k<=n),n和k代表的含义如上文
15 7
#include<cstdio>
#include<algorithm>
using namespace std;
int dis[];//把n分解
int cnt,len,ans,k,n;
bool lg1;
int ws[];//判断每一位都取值时最终的值是否可能超过n
int dp[];//取到底的记忆化
int les[];//不取到底的记忆化(当前值已经大于n并且还没到底,就返回了)
int dfs(int pos,int sum,int po){//sum*po为当前值,ws[pos]为上界,
if(sum*po<ws[pos]&&dp[pos]!=-&&(cnt+dp[pos]<k)){//当找的范围还在k内
cnt+=dp[pos];//当当前值小于上界时,就记忆化每一位都取的情况
return dp[pos];
}
else if(sum*po>ws[pos]&&les[pos]!=-&&(cnt+les[pos]<k)){
cnt+=les[pos];//当当前值大于上界,就记忆化至少有一位不选的情况(当至少有一位没取时可以保证
return les[pos];//最后得到的值一定小于n
}
int sum2=cnt;
int sum1=;
if(sum<=n){//当当前值满足条件时
sum1++;
cnt++;
if(cnt==k){
ans=sum;
lg1=false;
return ;
}
}
else
return ;
if(pos==)
return sum1;
for(int i=;i<=&&lg1;i++){//往下走
sum1+=dfs(pos-,sum*+i,po/);
}
//printf("%d %d\n",sum*po,ws[pos]);
if(sum*po<ws[pos])//当没有到上界
dp[pos]=sum1;
else if(sum*po>ws[pos])//当到上界
les[pos]=cnt-sum2;
return sum1;
}
int main(){
int t;
scanf("%d",&t);
while(t--){
cnt=;
scanf("%d%d",&n,&k);
len=;
fill(dp,dp+,-);
fill(les,les+,-);
int m=n;
int po=;
while(m){
po*=;
dis[++len]=m%;
m/=;
}
int r=;
int summ=;
for(int i=;i<len;i++){
summ+=dis[i]*r;
ws[i]=n-summ;
r*=;
}
lg1=true;
for(int i=;i<=&&lg1;i++){
dfs(len-,i,po/);
}
printf("%d\n",ans);
}
return ;
}
hdu6468(记忆化搜索)的更多相关文章
- [ACM_动态规划] 数字三角形(数塔)_递推_记忆化搜索
1.直接用递归函数计算状态转移方程,效率十分低下,可以考虑用递推方法,其实就是“正着推导,逆着计算” #include<iostream> #include<algorithm> ...
- 【BZOJ-3895】取石子 记忆化搜索 + 博弈
3895: 取石子 Time Limit: 1 Sec Memory Limit: 512 MBSubmit: 263 Solved: 127[Submit][Status][Discuss] D ...
- hdu3555 Bomb (记忆化搜索 数位DP)
http://acm.hdu.edu.cn/showproblem.php?pid=3555 Bomb Time Limit: 2000/1000 MS (Java/Others) Memory ...
- zoj 3644(dp + 记忆化搜索)
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4834 思路:dp[i][j]表示当前节点在i,分数为j的路径条数,从 ...
- loj 1044(dp+记忆化搜索)
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26764 思路:dp[pos]表示0-pos这段字符串最少分割的回文 ...
- DP(记忆化搜索) + AC自动机 LA 4126 Password Suspects
题目传送门 题意:训练指南P250 分析:DFS记忆化搜索,范围或者说是图是已知的字串构成的自动机图,那么用 | (1 << i)表示包含第i个字串,如果长度为len,且st == (1 ...
- HDU1978 记忆化搜索
How many ways Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- bzoj4562: [Haoi2016]食物链--记忆化搜索
这道题其实比较水,半个小时AC= =对于我这样的渣渣来说真是极大的鼓舞 题目大意:给出一个有向图,求入度为0的点到出度为0的点一共有多少条路 从入读为零的点进行记忆化搜索,搜到出度为零的点返回1 所有 ...
- 数位dp/记忆化搜索
一.引例 #1033 : 交错和 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 给定一个数 x,设它十进制展从高位到低位上的数位依次是 a0, a1, ..., an ...
- poj3592 强连通+记忆化搜索
题意:有一片 n*m 的矿地,每一格有矿.或这传送门.或者挡路岩石.除了岩石不能走以外,其他的格子都能够向右或向下走,走到一个非岩石的格子.对于每一个矿点,经过它就能得到它的所有矿石,而对于每一个传送 ...
随机推荐
- C#笔试题目总结
基础 知识点 try catch finally的执行顺序(有return的情况下): 不管有没有出现异常,finally块中代码都会执行: 当try和catch中有return时,finally仍然 ...
- 自己用ansible加shell 写的自动安装kubernetes的脚本
脚本地址:https://github.com/shatianxiaozi/auto_install_k8s.git 1. 下载 git clone https://github.com/shatia ...
- POJ3368(Frequent values)--线段树
题目在这里 3368 Accepted 7312K 1829MS C++ 6936B 题意为给你一组数据,再给定一组区间,问你这个区间内出现次数最多的元素的次数是多少. 我还记得这题是学校校赛基础的题 ...
- vue 做的tabBar组件
效果如下 调用 <tabbar :selected='selected'></tabbar> 组件 <template> <div class='tabbar ...
- Wireshark解密HTTPS数据流
如果是chrome浏览器的数据流 直接配置”SSLKEYLOGFILE“就可以解密了. 实现过程: 1.配置系统环境变量 变量名:SSLKEYLOGFILE 变量值:随意指定一个存储路径,以便chro ...
- 类中变量私有化和调用:__x和getx/setx或者property
__xx:双前置下划线,子类不可继承属性.方法,父类私有. 详见:https://www.cnblogs.com/andy9468/p/8299448.html 例子1:隐藏数据:私有化后,用get和 ...
- Java Data JPA +hibernate 保存或者是查询遇到的坑
由于项目需求,接触了Java Data JPA +hibernate,它的调用方式是controller调用service,service有实现的接口serviceimpl,serviceimpl调用 ...
- git管理分支某公司的流程
- Plot the figure of K-SVCR
clear %% generate data prettySpiral = 0; if ~prettySpiral % generate some random gaussian like data ...
- 关于Go Modules的一些内容
安装 配置环境 启用Go Modules go mod在Go >= 1.13才默认启用,在Go >= 1.11已经开始支持了go mod. 设置环境变量 # 启用go module exp ...