【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 ...
随机推荐
- SharePoint 2010 RBS 安装和配置遇到的一个问题
在按照微软官方的文档按照配置的时候遇到下面问题: <Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event ...
- Visio编辑数据库模型列
Visio编辑数据库模型列:邮件group->Open实体,进入实体属性编辑界面,按回车可以添加.
- Team Homework #3 软件工程在北航——IloveSE
任务要求: 采访以前上过北航 (计算机系/软件学院) 软件工程课的同学.现在上研/工作的也可以. 采访问题如下:* 平均每周花在这门课上的时间 (包括上课/作业/上机) * 平均写的代码总行数 ...
- 解释型语言和编译型语言如何交互?以lua和c为例
转自http://my.oschina.net/mayqlzu/blog/113528 问题: 最近lua很火,因为<愤怒的小鸟>使用了lua,ios上有lua解释器?它是怎么嵌入大ios ...
- 【Recover Binary Search Tree】cpp
题目: Two elements of a binary search tree (BST) are swapped by mistake. Recover the tree without chan ...
- 百分比布局实现响应式布局在 IE6 中填坑思路
最近接了个政府项目,政府项目要求响应式,并且兼容IE6,不想用媒体监测的方法,于是用了百分比布局的方法,但是IE6真是名不虚传,做第一个界面就遇到了个bug ①两张宽度各占50%的图片无法在同一横排, ...
- 二分--LIGHTOJ 1088查找区间(水题)
#include <iostream> #include <cstdio> #include <cmath> using namespace std; const ...
- 【Java】Eclipse导出jar包与javadoc
1.导出jar包 2.导出javadoc 3.jar包添加javadoc 4.出错解决 参考资料: http://www.cnblogs.com/cyh123/p/3345889.html http: ...
- WP手机升级WIN10被PIN码锁定
WP8.1手机升级WIN10后,需要输入PIN码(不知道啊),多次输入(1234,0000,8888 ...)后被锁定,无法使用手机(郁闷), 重启无数次,提示由于多次输入PIN码,手机无法使用(天啊 ...
- draw call 的优化
用一张贴图,renderstate都设置成一致,多个draw合并成一个