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 ...
随机推荐
- wp8环境搭建
Windows Phone 8将采用与Windows 8相同的NT内核,这就意味着WP8将可能兼容Win8应用,开发者仅需很少改动就能让应用在两个平台上运行.由于内核变更,Windows Phone ...
- 8个超炫的 Web 效果
CodePen 是一个在线的 HTML.CSS 和 JavaScript 代码编辑器,能够编写代码并即时预览效果.你在上面可以在线展示自己的作品,也可以看到其他人在网页中实现的各种令人惊奇的效果. 今 ...
- 爬虫库之BeautifulSoup学习(五)
css选择器: 我们在写 CSS 时,标签名不加任何修饰,类名前加点,id名前加 #,在这里我们也可以利用类似的方法来筛选元素,用到的方法是 soup.select(),返回类型是 list 1)通过 ...
- 5、overflow、hover
一.overflow 1.属性介绍 说明: 这个属性定义溢出元素内容区的内容会如何处理.如果值为 scroll,不论是否需要,用户代理都会提供一种滚动机制.因此,有可能即使元素框中可以放下所有内容也会 ...
- Event事件的三个阶段
转自www.w3school.com.cn/htmldom/event_bubbles.asp 在 2 级 DOM标准中,事件传播分为三个阶段: 第一,捕获阶段.事件从 Document 对象沿着文档 ...
- 五分钟了解Mecanim角色动画系统
http://www.narkii.com/club/thread-305414-1.html Unity 4.0推出的Mecanim动画系统已经有一段时间,不过据了解很多的朋友仍然在使用原来的角色动 ...
- 康少带你python项目从部署到上线云服务器
首先,服务器要安装nginx和mysql,网站文件建议放在/usr/local/www,环境python3.6+mysql5.7,阿里云的服务器可以用公共镜像有一个配置好的,不然就自己装一下环境吧. ...
- 多线程中join()
这个鬼东西百度了好久没弄明白,大佬们代码一粘贴好了完事,借助官方api终于是理解了,当然如果有问题欢迎大家用键盘来羞辱我. 首先 join有什么用? 他是用来确定线程何时结束的 , Thread ...
- String字符串操作题
/** * 反转键盘录入字符串 * 反转键盘录入的字符串 * 反转键盘录入的字符串 * 反转键盘录入的字符串 * */ Scanner sc = new Scanner(System.in);Stri ...
- Maven多模块构建实例
创建coffee-parent项目 New->Maven Project 创建coffee-web项目 右键coffee-parent项目->New->Project... 注意:需 ...