• HDU 3555 Bomb(数位DP)


                    

                    Bomb

                          Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)
                                Total Submission(s): 11804    Accepted Submission(s): 4212


    Problem Description
    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?
     
    Input
    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.
     
    Output
    For each test case, output an integer indicating the final points of the power.
     
    Sample Input
    3 1 50 500
     
    Sample Output
    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.
     
    Author
    fatboy_cw@WHU
     
    Source

    【思路】

           数位DP。

       预处理:

                  f[i][0] 表示i位数中不含49的数的数目

                  f[i][1] 表示i位数中不含49且最高位为9的数的数目

                  f[i][2] 表示i位数中含49的数的数目

           根据n的每一位统计ans,具体见代码。

    【代码】

     1 #include<cstdio>
     2 using namespace std;
     3 
     4 typedef long long LL;
     5 LL f[25][3];
     6 /*
     7      f[i][0] i位数 无49存在
     8     f[i][1] i位数 无49存在且末尾为9
     9     f[i][2] i位数 有49
    10 */
    11 int b[25];
    12 
    13 void init() {
    14     f[0][0]=1; f[0][1]=f[0][2]=0;
    15     for(int i=1;i<25;i++) {
    16         f[i][0]=10*f[i-1][0]-f[i-1][1];
    17         f[i][1]=f[i-1][0];
    18         f[i][2]=10*f[i-1][2]+f[i-1][1];
    19     }
    20 }
    21 
    22 int main() {
    23     int T; LL n;
    24     scanf("%d",&T);
    25     init();
    26     while(T--) {
    27         scanf("%I64d",&n);
    28         int len=0;
    29         while(n)
    30             b[++len]=n%10 , n/=10;
    31         b[len+1]=0;
    32         LL ans=0; bool flag=0;
    33         for(int i=len;i;i--) {
    34             ans += b[i]*f[i-1][2];                    // + ...49... 
    35             if(flag) ans += f[i-1][0]*b[i];            // + 49...(无49...)
    36             else if(b[i]>4) ans += f[i-1][1];        // + 4(9 无49)
    37             if(b[i+1]==4 && b[i]==9) flag=1;
    38         }
    39         if(flag) ans++;                                //算上自身
    40         printf("%I64d
    ",ans);
    41     }
    42     return 0;
    43 }
  • 相关阅读:
    如何查看MySQL的当前存储引擎?
    避免生产环境执行更新删除语句忘记加where条件的解决方案
    物联网发展的现状
    目前行业内比较流行的开源时序数据库产品
    如何查看端口(3306)被那个程序占用
    MySQL数据库开发的36条军规
    介绍 MySQL 8 中值得关注的新特性和改进。
    IE浏览器 兼容性(IE9-11 差异说明)
    python3:(unicode error) 'utf-8' codec can't decode
    静态代码块
  • 原文地址:https://www.cnblogs.com/lidaxin/p/5122181.html
Copyright © 2020-2023  润新知