hdu2089——不要62

这题其实不用数位DP,很神奇的一个做法

考虑到数据范围只有1e6,预处理打表。

判断时,卡一下常数。

卡常数的注意点有:
1.将数转换成字符串,不能用stringstream&string,否则应该TLE,只能模拟分解

while(x)
{
    a[++cnt]=x%10;
    x/=10;
}

 像这样

2.两行优化

#pragma GCC optimize (2)
#pragma GCC optimize (3)

3.判断不符合要求的,再用总个数减去

printf("%d\n",m-n+1-f[m]+f[n-1]);

代码:

#pragma GCC optimize (2)
#pragma GCC optimize (3)
#include<bits/stdc++.h>

#define rd(x) x=read()

using namespace std;

int n,m;
int f[1000005];
int a[10];

inline int read()
{
    int f=1,x=0;char s=getchar();
    while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
    while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
    return x*f;
}

bool check(int x)
{
    int cnt=0;
    memset(a,0,sizeof(a));
    while(x)
    {
        a[++cnt]=x%10;
        x/=10;
        if(a[cnt]==4)return true;
    }
    for(int i=1;i<cnt;i++)
        if(a[i]==2&&a[i+1]==6)
            return true;
    return false;
} 

int main()
{
    f[1]=0;
    for(int i=2;i<=1000000;i++)f[i]=f[i-1]+check(i);
    while(scanf("%d%d",&n,&m)!=EOF&&n&&m)
    {
        printf("%d\n",m-n+1-f[m]+f[n-1]);
    }
        
    
    return 0;
}

 

猜你喜欢

转载自www.cnblogs.com/Robin20050901/p/10136325.html