【poj3208-Apocalypse Someday】数位DP
题意:问你在所有包含666的数中,第n大的是多少。(1 ≤ n ≤ 50,000,000) 。开头几个是666, 1666, 2666, 3666, 4666, 5666…
题解:
这题可以用AC自动机,不知道这个怎么做。。
用了数位DP。
第一道自己好好调出来的数位DP。。哭泣
(一)先用DP预处理出含有666的k位数一共有多少个,不含有666的k位数一共有多少个。只用求一边就可以,另一边用总数来减。
然后for一遍,判断出第n大的是多少位数。
//d[0][i] 第一位不是6的i位数不含666总方案数
//d[1][i] 第一位是6...
//d[2][i] 连续两个6...
//d[3][i] 不含666的i位数的总方案数
//d[4][i] 含有666的i位数...
(二)填数(从左往右)。填的时候要记录前两位是什么。
分两种情况:
1.填的数中已经有666。则后面的位可以填有666和没有666的数。
2.没有666。
这个再分两种 (1)现在不要填6-->则后面必须有666
(2)现在填6 如果是xx6,则后面可以是66xxxx或含有666的数;如果是x66,则后面是6xxx或者66xxx或者含有666的数。如果是xx6,则后面是66xxx或者含有666的数。
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<queue>
using namespace std; typedef long long LL;
const int N=,D=;
LL d[][];
int n,ans[];
//d[0][i] 第一位不是6的i位数不含666总方案数
//d[1][i] 第一位是6...
//d[2][i] 连续两个6...
//d[3][i] 不含666的i位数的总方案数
//d[4][i] 含有666的i位数... int main()
{
freopen("a.in","r",stdin);
freopen("a.out","w",stdout);
memset(d,,sizeof(d));
memset(ans,,sizeof(ans));
LL sum=;
d[][]=;d[][]=;d[][]=;d[][]=;d[][]=;
d[][]=*;d[][]=;d[][]=;d[][]=*;d[][]=;
for(int i=;i<=D;i++)
{
d[][i]=*d[][i-];
d[][i]=d[][i-];
d[][i]=d[][i-];
d[][i]=d[][i]+d[][i]+d[][i];
sum*=;
d[][i]=sum-d[][i];
}
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d",&n);
int k=;
for(LL i=;i<=D;i++)
if(d[][i]>n) {k=i;break;}
int now=,a=,b=;
bool ok=;
for(int i=;i<=k;i++)
{
if(i==k)
{
if(!ok) ans[k]=;
else ans[k]=n-now-;
break;
}
bool bk=;
for(int j=;j<=;j++)
{
if(!ok)
{
if(j!=)
{
if(now+d[][k-i]<n) now+=d[][k-i];
else ans[i]=j,bk=;
}
else
{
if(a== && b==)
{
if(now+d[][k-i]+d[][k-i]<n) now+=d[][k-i]+d[][k-i];
else ans[i]=j,bk=,ok=;
}
else if(a!= && b==)
{
if(now+d[][k-i]+d[][k-i]+d[][k-i]<n) now+=d[][k-i]+d[][k-i]+d[][k-i];
else ans[i]=j,bk=;
}
else //这里原本打了a、b都不等于6,WA,应该是b不等于6就可以了。
{
if(now+d[][k-i]+d[][k-i]<n) now+=d[][k-i]+d[][k-i];
else ans[i]=j,bk=;
}
}
}
else
{
if(now+d[][k-i]+d[][k-i]<n) now+=d[][k-i]+d[][k-i];
else ans[i]=j,bk=;
}
if(bk) break;
}
a=ans[i-],b=ans[i];
}
bool fir=;
for(int i=;i<=k;i++)
{
if(fir== && ans[i]==) continue;
if(fir== && ans[i]!=) fir=;
if(fir) printf("%d",ans[i]);
}
if(T) printf("\n");
}
return ;
}
【poj3208-Apocalypse Someday】数位DP的更多相关文章
- poj3208 Apocalypse Someday 数位dp+二分 求第K(K <= 5*107)个有连续3个6的数。
/** 题目:poj3208 Apocalypse Someday 链接:http://poj.org/problem?id=3208 题意:求第K(K <= 5*107)个有连续3个6的数. ...
- poj3208 Apocalypse Someday[数位DP]
数位中出现至少3个连续的'6'的数字(称魔鬼数),询问满足要求的排名k的数. 经典题型.采用试填法. 递推做法:预处理出$i$位数字中满足要求的数(下记为'魔鬼数').对每一位都从0到9试一遍,然而卡 ...
- POJ 3689 Apocalypse Someday [数位DP]
Apocalypse Someday Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 1807 Accepted: 87 ...
- POJ3208 Apocalypse Someday(二分 数位DP)
数位DP加二分 //数位dp,dfs记忆化搜索 #include<iostream> #include<cstdio> #include<cstring> usin ...
- POJ3208 Apocalypse Someday
题意 Language:Default Apocalypse Someday Time Limit: 1000MS Memory Limit: 131072K Total Submissions: 2 ...
- POJ-3208 Apocalypse Someday (数位DP)
只要某数字的十进制表示中有三个6相邻,则该数字为魔鬼数,求第X小的魔鬼数\(X\le 5e7\) 这一类题目可以先用DP进行预处理,再基于拼凑思想,用"试填法"求出最终的答案 \( ...
- POJ 3208-Apocalypse Someday(数位dp)
题意:给定n,输出第n大包含666的数字. 分析:dp[i][j][k][l]表示 长度为i,当前位是否是6,前一位是否6,是否已经包含666,表示的数量,再用二分找出第n大的这样的数字. #incl ...
- 数位DP专题
这周开始刷数位DP,在网上找到一份神级数位DP模板,做起题目来爽歪歪. http://www.cnblogs.com/jffifa/archive/2012/08/17/2644847.html in ...
- 开坑数位dp
[背景] 在10月3日的dp专练中,压轴的第6题是一道数位dp,于是各种懵逼. 为了填上这个留存已久的坑,蒟蒻chty只能开坑数位dp了. [例题一][HDU2089]不要62 题目大意:给你一个区间 ...
- 数位dp真·浅谈 By cellur925
预警:由于是从$Vergil$学长那里和$Mathison$大神那里学来的,所以清一色记忆化搜索!qwq 巨佬的数位dp讲解(未来的咕咕日报头条): https://www.luogu.org/blo ...
随机推荐
- phpstorm自动对齐数组=>,自动加空格
写完代码后可以点菜单中code-reformat code,快捷键是option+command+L
- VS模板文件修改,自动生成注释
VS的模板文件存放在IDE下的ItemTemplatesCache文件夹下 1.不同VS版本IDE文件夹路径个有不同,下面以VS2012为例,IDE文件夹路径如图:
- [转]流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls)
[转]流媒体协议介绍(rtp/rtcp/rtsp/rtmp/mms/hls) http://blog.csdn.net/tttyd/article/details/12032357 RTP ...
- P3245: 最快路线
这道题其实还是不难的,只是自己搞混了=-=//晕,做了好久啊,其实就是个spfa,关键是存储路径搞昏了.输出格式要求太严了,航模不能有空格啊,所以因为格式WA了三次,哭啊/(ㄒoㄒ)/~~.贴上代码吧 ...
- C++设计模式——享元模式
本文版权归果冻说所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利.如果这篇文章对你有帮助,你可以请我喝杯咖啡. » 本文链接:http:// ...
- 微软职位内部推荐-Senior Software Development Engineer H/F
微软近期Open的职位: Microsoft Engineering Center Paris (Xbox Music et Video) : Ingénieur en développement l ...
- cocos2dx中使用声音引擎需要包含的头文件
1.需要包含的头文件和命名空间 #include "SimpleAudioEngine.h"using namespace CocosDenshion;
- 20145129 《Java程序设计》第5周学习总结
20145129 <Java程序设计>第5周学习总结 教材学习内容总结 语法与继承架构 使用try.catch Java中所有错误都会被打包为对象,可以尝试(try)捕捉(catch)代表 ...
- python代码风格指南:pep8 中文翻译
摘要 本文给出主Python版本标准库的编码约定.CPython的C代码风格参见PEP7.本文和PEP 257 文档字符串标准改编自Guido最初的<Python Style Guide&g ...
- 我给女朋友讲编程html系列(3) --html中的超链接标签-a标签 和 框架frame与框架集frameset
我们浏览网页的时候,当单击某段文字或图片时,就会打开一个新的网页,这里面就使用了超链接. 就比如下图是一个导航类网页,当你单击某个链接就会打开新的网页. 比如,我拿我的qq空间“金河访谈”举例,新建一 ...