码迷,mamicode.com
首页 > 其他好文 > 详细

ZOJ 3950 How Many Nines

时间:2017-04-10 20:14:56      阅读:224      评论:0      收藏:0      [点我收藏+]

标签:break   amp   style   zoj   printf   nbsp   while   span   names   

暴力,预处理。

先计算出一个平年有多少$9$,一个闰年有多少$9$。一组数组,头和尾暴力枚举一下,中间的直接算。

#include<bits/stdc++.h>
using namespace std;

int a[2][20]=
{
    {0,31,28,31,30,31,30,31,31,30,31,30,31},
    {0,31,29,31,30,31,30,31,31,30,31,30,31},
};

int leap(int x)
{
    if(x%400==0) return 1;
    if(x%4==0&&x%100!=0) return 1;
    return 0;
}

int c[20000];
int x,y;
int f[20000];
int k[20000];

void init()
{
    for(int i=0;i<=9999;i++)
    {
        c[i]=0;
        int tmp=i;
        while(tmp)
        {
            if(tmp%10==9) c[i]++;
            tmp=tmp/10;
        }
    }

    int M=1, D=1;
    x=0;y=0;

    while(1)
    {
        x=x+c[D]+c[M];

        D++;
        if(D>a[0][M])
        {
            M++;
            D=1;
            if(M>12)
            {
                M=1;
            }
        }

        if(M==12&&D==31) break;
    }

    y=x+1;

    for(int i=2000;i<=9999;i++) f[i] = leap(i) + f[i-1];
    for(int i=2000;i<=9999;i++) k[i] = k[i-1] + c[i]*(365+leap(i));

}

int main()
{
    init(); int T; scanf("%d",&T);
    while(T--)
    {

        int ans=0;

        int A1,B1,C1; scanf("%d%d%d",&A1,&B1,&C1);
        int A2,B2,C2; scanf("%d%d%d",&A2,&B2,&C2);

        if(A1==A2||A1+1==A2)
        {
            int Y=A1, M=B1, D=C1;
            while(1)
            {
                ans=ans+c[Y]+c[M]+c[D];
                if(Y==A2&&M==B2&&D==C2) break;

                D++;
                if(D>a[leap(Y)][M])
                {
                    M++;
                    D=1;
                    if(M>12)
                    {
                        M=1;Y++;
                    }
                }

            }
        }
        else
        {
            int Y=A1, M=B1, D=C1;
            while(1)
            {
                ans=ans+c[Y]+c[M]+c[D];
                if(Y==A1&&M==12&&D==31) break;

                D++;
                if(D>a[leap(Y)][M])
                {
                    M++;
                    D=1;
                    if(M>12)
                    {
                        M=1;Y++;
                    }
                }

            }

            Y=A2, M=1, D=1;

            while(1)
            {
                ans=ans+c[Y]+c[M]+c[D];
                if(Y==A2&&M==B2&&D==C2) break;

                D++;
                if(D>a[leap(Y)][M])
                {
                    M++;
                    D=1;
                    if(M>12)
                    {
                        M=1;Y++;
                    }
                }

            }

            ans=ans+k[A2-1]-k[A1]+x*(A2-A1-1)+f[A2-1]-f[A1];
        }

        printf("%d\n",ans);
    }
    return 0;
}

 

ZOJ 3950 How Many Nines

标签:break   amp   style   zoj   printf   nbsp   while   span   names   

原文地址:http://www.cnblogs.com/zufezzt/p/6690685.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!