zoukankan      html  css  js  c++  java
  • 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 }
  • 相关阅读:
    Keras如何构造简单的CNN网络
    到底该如何入门Keras、Theano呢?(浅谈)
    PyCharm使用技巧记录(一)如何查看变量
    使用 环境变量 来配置批量配置apache
    QT静态链接
    NTP服务器
    debian添加sudo
    龙芯8089_D安装debian 8 iessie
    verilog 双向IO实现
    FPGA入门学习第一课:二分频器
  • 原文地址:https://www.cnblogs.com/lidaxin/p/5122181.html
Copyright © 2011-2022 走看看