美文网首页
HDU 2089 不要62

HDU 2089 不要62

作者: itbird01 | 来源:发表于2022-04-10 07:09 被阅读0次

Problem Description

杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。
杭州交通管理局经常会扩充一些的士车牌照,新近出来一个好消息,以后上牌照,不再含有不吉利的数字了,这样一来,就可以消除个别的士司机和乘客的心理障碍,更安全地服务大众。
不吉利的数字为所有含有4或62的号码。例如:
62315 73418 88914
都属于不吉利号码。但是,61152虽然含有6和2,但不是62连号,所以不属于不吉利数字之列。
你的任务是,对于每次给出的一个牌照区间号,推断出交管局今次又要实际上给多少辆新的士车上牌照了。

Input
输入的都是整数对n、m(0<n≤m<1000000),如果遇到都是0的整数对,则输入结束。

Output
对于每个整数对,输出一个不含有不吉利数字的统计个数,该数值占一行位置。

Sample Input

1 100 0 0

Sample Output

80
java code(Time out)

import java.util.Scanner;
public class Main {
   public static void main(String[] args) {
       Scanner input = new Scanner(System.in);
       while (input.hasNext()) {
           int n = input.nextInt();
           int m = input.nextInt();
           // 0<n≤m<1000000
           if (n == 0 && m == 0) {
               break;
           }
           int sum = m - n + 1;
           for (int i = n; i <= m; i++) {
               // String string = String.valueOf(i);
               // // 使用contains超时
               // if (string.contains("4") || string.contains("62")) {
               // sum--;
               // }
               //time out
               char[] strs = String.valueOf(i).toCharArray();
               for (int j = 0; j < strs.length; j++) {
                   if (strs[j] == '4'
                           || (strs.length >= 2 && j < strs.length - 1
                                   && strs[j] == '6' && strs[j + 1] == '2')) {
                       sum--;
                       break;
                   }
               }
           }
           System.out.println(sum);
       }
       input.close();
   }

}

c++ code

#include <iostream>
using namespace std  ;
int f[8][10] ;//f[i][j]表示第i位是数j时符合条件的数字数量
int digit[9] ;//digit[i]表示n从右到左第i位是多少
void Init()
{
    f[0][0]=1 ;
    for(int i=1 ;i<=7 ;i++)
    {
        for(int j=0 ;j<10 ;j++)//枚举第i位
        {
            for(int k=0 ;k<10 ;k++)//枚举第i-1位
            {
                if(!(j==6 && k==2) && j!=4)//如果符合条件
                    f[i][j]+=f[i-1][k] ;
            }
        }
    }
}
int callen(int n)//计算n的长度
{
    int cnt=0 ;
    while(n)
    {
        cnt++ ;
        n/=10 ;
    }
    return cnt ;
}
void caldigit(int n,int len)//计算n的digit数组
{
    memset(digit,0,sizeof(digit)) ;
    for(int i=1 ;i<=len ;i++)
    {
        digit[i]=n%10 ;
        n/=10 ;
    }
}
int solve(int n)//计算[0,n]区间满足条件的数字个数
{
    int ans=0 ;
    int len=callen(n) ;
    caldigit(n,len) ;
    for(int i=len ;i>=1 ;i--)
    {
        for(int j=0 ;j<digit[i] ;j++)//枚举第i位取值
        {
            if(!(j==2 && digit[i+1]==6) && j!=4)//第i位满足条件
                ans+=f[i][j] ;
        }
        if(digit[i]==4 || (digit[i]==2 && digit[i+1]==6))//第i位已经不满足条件,则i位以后都不可能满足条件,结束循环
            break ;
    }
    return ans ;
}
int main()
{
    Init() ;
    int n,m ;
    while(~scanf("%d%d",&n,&m))
    {
        if(n==0 && m==0)
            break ;
        printf("%d\n",solve(m+1)-solve(n)) ;//用[0,m]-[0,n)即可得到区间[n,m]
    }
    return 0 ;
}```

相关文章

  • HDU 2089 不要62

    Problem Description 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。杭州交通管理局经常会...

  • CUC-SUMMER-11-B

    B - 不要62 HDU - 2089 杭州人称那些傻乎乎粘嗒嗒的人为62(音:laoer)。杭州交通管理局经常会...

  • 数位dp

    数位dp的入门题HDU - 2089 不要62题意:求区间[n,m]之间,不含有4和(连续的)62的数字个数。分析...

  • 震惊!数位dp竟然还能有板子!!

    不要62(HDU - 2089)经典的数位dp的入门题。今天才知道原来这就可以做成一个板子。题意:给你一个l和一个...

  • hdu2089&hdu5179(数位dp)

    2089题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2089 题...

  • ZCMU训练--190705:2016大学生程序设计比赛

    目录A:HDU 5933B:HDU 5934C:HDU 5935D:HDU 6312E:HDU 6308F: HD...

  • HDU-2089 补个最经典的数位DP

    统计[0,N]区间不包含4且不包含62的整数个数。 状态设计:DP[pos][0] 表示当前考虑pos位,不包含4...

  • 2019.01.19算法题:HDU - 1171

    HDU - 1171Big Event in HDU(多重背包) 题目地址:http://acm.hdu.edu....

  • 2089

    2022.12.20 星期二 晴 今天早晨给云灿煎了鸡蛋饼,上班前把家里钥匙给奶妈送过去,云灿在家上网课,...

  • cd

    cd ~/Documents 进入用户下的文档然后,要进入文档下的hdu文件夹,只需cd hdu 而不是cd /hdu

网友评论

      本文标题:HDU 2089 不要62

      本文链接:https://www.haomeiwen.com/subject/jfbtsrtx.html