hdu 3555 Bomb 炸弹(数位DP,入门)
题意:
给一个数字n,求从1~n中有多少个数是含有49的,比如49,149,1490等都是含49的。
思路:
2^64也顶多是十进制的20多位,那么按十进制位来分析更简单。如果能计算k位十进制数中分别有多少个含49的,那么计算就简单了。
首先要求关于十进制位的一些信息,比如:i位的十进制数包含49有多少个,不包含49的多少个(除掉最高位是9的数量),不包含49但是最高位是9的有多少个(因为可能和更高一位组合成49)。注意精度,注意爆longlong。
- #include <bits/stdc++.h>
- #define LL long long
- using namespace std;
- const int N=;
- LL dp[N][];
- int s[];
- void init()
- {
- dp[][]=;
- for(int i=; i<N; i++)
- {
- dp[i][]=dp[i-][]*-dp[i-][]; //dp[i][0]代表长度为 i 并且不含有49的数字的个数;
- dp[i][]=dp[i-][]; //dp[i][1]代表长度为 i 并且不含有49,但是最高位是9的数字的个数;
- dp[i][]=dp[i-][]+dp[i-][]*; //dp[i][2]代表长度为 i 并且含有49的数字的个数。
- }
- }
- int main()
- {
- init();
- freopen("input.txt", "r", stdin);
- LL t, n;
- cin>>t;
- while(t--)
- {
- memset(s,,sizeof(s));
- scanf("%lld",&n);
- int cnt=;
- n++; //个位上必须大出1,方便计算出现紧挨着的49的情况。
- while(n)
- {
- s[++cnt]=n%; //逐位提取出来
- n/=;
- }
- LL ans=;
- int last=, flag=;
- for(int i=cnt; i>; i--) //具体就是要分析什么情况下会出现49,而且不能计算重复。
- {
- ans+=s[i]*dp[i-][];
- if(flag) ans+=dp[i-][]*s[i]; //之前出现过紧挨着的49,那么第i位所可能出现的0~s[i]-1都与dp[i-1][0]个构成符合条件的数。
- if(!flag&&s[i]>) ans+=dp[i-][]; //s[i]大于4的情况,如果flag为true,那么都会在之前的紧挨49之后的那一步被统计掉。
- if(last==&&s[i]==) flag=true; //一旦flag开启,一直开启。目的是为了计算上限。
- last=s[i];
- }
- cout<<ans<<endl;
- }
- return ;
- }
AC代码
通用的解法。
- //#include <bits/stdc++.h>
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <cmath>
- #include <map>
- #include <algorithm>
- #include <vector>
- #include <iostream>
- #define pii pair<int,int>
- #define INF 0x7f3f3f3f
- #define LL long long
- #define ULL unsigned long long
- using namespace std;
- const double PI = acos(-1.0);
- const int N=;
- ULL dp[N][];
- int bit[N];
- void pre_cal()
- {
- dp[][]=;
- for(int i=; i<=; i++ ) //计算不含49的
- {
- dp[i][]=*dp[i-][]-dp[i-][];
- dp[i][]=dp[i-][]; //以9开头
- }
- }
- ULL cal(ULL n) //计算区间[0~n]吉利的数量
- {
- int len=, i;
- ULL big=n;
- while(n)
- {
- bit[++len]=n%;
- n/=;
- }
- bit[len+]=;
- ULL ans=;
- for(i=len ;i>; i--)
- {
- ans+=dp[i-][]*bit[i];
- if(bit[i]>) ans-=dp[i-][];
- if(bit[i+]==&&bit[i]==) break;
- }
- if(i==) ans++; //n本身是否吉利?
- return big-ans+;
- }
- int main()
- {
- //freopen("input.txt","r",stdin);
- pre_cal();
- int t;cin>>t;
- ULL s;
- while(t--)
- {
- scanf("%lld",&s);
- printf("%llu\n",cal(s));
- }
- return ;
- }
AC代码
hdu 3555 Bomb 炸弹(数位DP,入门)的更多相关文章
- hdu 3555 Bomb(数位dp入门)
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Subm ...
- HDU 3555 Bomb(数位DP模板啊两种形式)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 Problem Description The counter-terrorists found ...
- HDU 3555 Bomb(数位DP)
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Subm ...
- 动态规划晋级——HDU 3555 Bomb【数位DP详解】
转载请注明出处:http://blog.csdn.net/a1dark 分析:初学数位DP完全搞不懂.很多时候都是自己花大量时间去找规律.记得上次网络赛有道数位DP.硬是找规律给A了.那时候完全不知数 ...
- HDU 3555 Bomb (数位DP)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 题目大意:从0开始到给定的数字N所有的数字中遇到“49”的数字的个数. Sample Input ...
- hdu 3555 Bomb 【数位DP】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3555 题意:上一题是不要62 这个是"不要49" 代码: #include < ...
- hdu 3555 Bomb ( 数位DP)
Bomb Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others) Total Subm ...
- HDU 2089 - 不要62 - [数位DP][入门题]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 Time Limit: 1000/1000 MS (Java/Others) Memory Li ...
- Hdu 2089 不要62 (数位dp入门题目)
题目链接: Hdu 2089 不要62 题目描述: 给一个区间 [L, R] ,问区间内不含有4和62的数字有多少个? 解题思路: 以前也做过这个题目,但是空间复杂度是n.如果数据范围太大就GG了.今 ...
- hdu 4722 Good Numbers( 数位dp入门)
Good Numbers Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tota ...
随机推荐
- nginx proxy https
server {listen 443;server_name mail.jb51.net; ssl on;ssl_certificate server.crt;ssl_certificate_key ...
- int和Integer及拆箱与装箱
int和Integer 如果面试官问Integer与int的区别:估计大多数人只会说道两点,Ingeter是int的包装类,int的初值为0,Ingeter的初值为null.但是如果面试官再问一下In ...
- Ubuntu解压windows下的.zip文件出现乱码的解决办法
乱码类似这样的:╫╩┴╧╖┤╤▌▓т╒╛╦┘╢╚│ 这个主要是因为zip文件对文件名的编码默认为当前环境的locale,如在windows下压缩的zip文件,在linux下其中的中文名便会乱码.这是z ...
- 1.13-1.14 Hive Action
一.Hive Action 1.创建文件 [root@hadoop-senior oozie-apps]# pwd /opt/cdh-5.3.6/oozie-4.0.0-cdh5.3.6/oozie- ...
- html5代码如何转成小程序代码
插件源码 链接:https://pan.baidu.com/s/1pGY8ZsdESaQGEzoEgpb_Rw 提取码:s1ix 放到与pages文件夹同级目录下 js中调用 //引入 var wx ...
- HDOJ1874最短路【spfa】
//不知道切过这道题目几次了,这次又wa了...双向路啊....这波简直无奈了,今晚又是浪成狗!!!! #include<cstdio> #include<vector> #i ...
- IT兄弟连 JavaWeb教程 Servlet会话跟踪 Cookie常用方法
以下是在Servlet中操作Cookie时可使用的有用的方法列表 ● public void setDomain(String pattern) 该方法设置cookie适用的域,例如 itxdl.c ...
- Oracle GoldenGate对接 Oracle 11g和Kafka
本文主要是向读者介绍如何通过 ogg 为 oracle 数据库的变更操作实时同步到大数据产品 kafka 上. 开始介绍前,先为读者介绍一下环境背景 机器ip 和其对应的服务 192.168.88.1 ...
- UVA10140 Prime Distance【素数/数论】By cellur925
题目传送门 我们注意到,L,R是肥肠大的.........我们不可能在1s内筛出2^31内的全部质数. “上帝为你关上一扇门,同时为你打开一扇窗” 我们又注意到,R-L是肥肠比较小的,珂以从这入手解决 ...
- typescript学习笔记(一)----基础类型
1.使用typescript前第一个操作就是全局配置typescript环境 ---------------npm install -g typescript 2.typescript(以下称为ts, ...