HDU 3555 Bomb(数位DP)
2016-01-11 18:32
441 查看
Bomb
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 11804 Accepted Submission(s): 4212
[align=left]Problem Description[/align]
The
counter-terrorists found a time bomb in the dust. But this time the
terrorists improve on the time bomb. The number sequence of the time
bomb counts from 1 to N. If the current number sequence includes the
sub-sequence "49", the power of the blast would add one point.
Now the counter-terrorist knows the number N. They want to know the final points of the power. Can you help them?
[align=left]Input[/align]
The
first line of input consists of an integer T (1 <= T <= 10000),
indicating the number of test cases. For each test case, there will be
an integer N (1 <= N <= 2^63-1) as the description.
The input terminates by end of file marker.
[align=left]Output[/align]
For each test case, output an integer indicating the final points of the power.
[align=left]Sample Input[/align]
3
1
50
500
[align=left]Sample Output[/align]
0
1
15
Hint
From 1 to 500, the numbers that include the sub-sequence "49" are "49","149","249","349","449","490","491","492","493","494","495","496","497","498","499",
so the answer is 15.
[align=left]Author[/align]
fatboy_cw@WHU
[align=left]Source[/align]
2010 ACM-ICPC Multi-University Training Contest(12)——Host by WHU
【思路】
数位DP。
预处理:
f[i][0] 表示i位数中不含49的数的数目
f[i][1] 表示i位数中不含49且最高位为9的数的数目
f[i][1] 表示i位数中含49的数的数目
根据n的每一位统计ans,具体见代码。
【代码】
#include<cstdio> using namespace std; typedef long long LL; LL f[25][3]; /* f[i][0] i位数 无49存在 f[i][1] i位数 无49存在且末尾为9 f[i][2] i位数 有49 */ int b[25]; void init() { f[0][0]=1; f[0][1]=f[0][2]=0; for(int i=1;i<25;i++) { f[i][0]=10*f[i-1][0]-f[i-1][1]; f[i][1]=f[i-1][0]; f[i][2]=10*f[i-1][2]+f[i-1][1]; } } int main() { int T; LL n; scanf("%d",&T); init(); while(T--) { scanf("%I64d",&n); int len=0; while(n) b[++len]=n%10 , n/=10; b[len+1]=0; LL ans=0; bool flag=0; for(int i=len;i;i--) { ans += b[i]*f[i-1][2]; // + ...49... if(flag) ans += f[i-1][0]*b[i]; // + 49...(无49...) else if(b[i]>4) ans += f[i-1][1]; // + 4(9 无49) if(b[i+1]==4 && b[i]==9) flag=1; } if(flag) ans++; //算上自身 printf("%I64d\n",ans); } return 0; }
相关文章推荐
- iOS开发网络篇之文件下载、大文件下载、断点下载
- 1073. Scientific Notation (20)
- 将集合转成特征矩阵并且使用最小Hash算法构造签名矩阵
- Babel转ES5后IE8下的兼容性问题解决方案
- 阅读zepto.js的core中的Core methods
- iOS UI-静态单元格与动态单元格
- Spark MLlib FPGrowth算法,mllibfpgrowth
- PHP--判空
- 硬盘导致系统蓝屏
- MDK编译出现*.axf: Error: L6218E: Undefined symbol 问题解决方法
- Linux 系统应用编程——进程间通信(下)
- 文档的相似性可以使用Shingling算法进行比较
- 【Leetcode】3. Longest Substring Without Repeating Characters
- 选择排序
- Oracle trunc()函数的用法总结
- CodeForces 611A New Year and Days
- linux学习笔记02
- uiautomator基本操作命令
- 从僵尸网络追踪到入侵检测 第5章 使用Honeyd创建防御路由模板
- 蓝桥杯 历届试题 最大子阵