hdoj-2089-不要62

題目:不要62
代碼1:(TLE)

#include<stdio.h>
#include<string.h>
int main()
{
    int n,m,i,j,t=0;
    int a,b,sum=0,k=0;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        if(n==0 && m==0)break;
        for(i=n;i<=m;i++)
        {
            a=i;
            b=i;
            
            sum++;
            
            while(a>0)
            {
                if(a%100==62)
                {
                    sum--;
                    k=1;
                    //printf("%d -1\n",a);
                    break;
                }
                a=a/10;
            }//是不是62
            
            while(b>0)
            {
                if(b%10==4 && k==0)
                {
                    //printf("%d -2\n",b);
                    sum--;
                    break;
                }
                b=b/10;
            }//位數是否含四
            
            k=0;
        }
        printf("%d\n",sum);
    }
    return 0;
}

說實在,我認爲我的代碼T有一點說不過去。但是它T了,discuss裏也是哀聲四起。hdoj裏面雖說有很多好題目,但是其中個別題目質量堪憂,比如2090算菜價,明明要求四捨五入(printf("%.1lf\n",(n*m+0.05));),但是提交評測以後居然是WA,刪除以後AC。
這道容易懂的題目有一種更省時間的算法,我沒看到它之前沒有想到這個方法。這裏也貼出來:

#include<stdio.h>
int data[1000005];
int main()
{
    int m,n;
    int i;
    int t;
    int sum;
    for(i=4;i<=1000003;i++)
    {
        t=i;
        while(t)
        {
            if(t%10==4||t%100==62)
                data[i]=1;//符合要求數組存1
            t/=10;
        }
    }
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        sum=0;
        if(m==0&&n==0)
            break;
        for(i=m;i<=n;i++)
            sum+=data[i];
        printf("%d\n",n-m+1-sum);
    }
    return 0;
}

先從很大範圍內找出符合要求的所有數,若符合要求數組存1,之後再在輸入流裏面累加,n-m+1-sum

先在大範圍中找出符合要求的數存入數組,在需要使用的時候調用數組內元素。省時的一種小技巧。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章