E.今天也是元气满满的一天 | 2018 校内选拔赛 预选赛 Day2

Description

我们使用格式 YYYYMMDD 表示一个日期
显然,一个日期由 8 个 0 ~ 9 之间的数码组成
在这 8 个数码组成的数列中
如果有连续 3 个或以上的数码可以构成等差数列

等差数列(又名算术数列)是数列的一种。在等差数列中,任何相邻两项的差相等。该差值称为公差。例如数列 3, 5, 7, 9, 11, 13 就是一个等差数列。 在这个数列中,从第二项起,每项与其前一项之差都等于2,即公差为2。
Sigler, Laurence E. (trans.). Fibonacci’s Liber Abaci.
Springer-Verlag. 2002: 259–260. ISBN 978-0-387-95419-6.

那么这个日期将无法成为密码
请你找出无法成为密码的日期有多少

Input

两行
第一行是开始日期
第二行是结束日期
日期使用格式 YYYYMMDD 表示,且均不在 1900 年 1 月 1 日之前,均不在 2999 年 12 月 31 日之后
保证结束日期不在开始日期之前

Output

一个数字
表示从开始日期到结束日期的日期范围(包括开始日期和结束日期)内,有多少个日期无法成为密码

Sample Input

19980327
19980806

Sample Output

3

Hint

暴力。

题解

// #define debug
#include "bits/stdc++.h"
using namespace std;
inline int query_days_for_year(int y)
{
    return (y % 400 == 0|| (y % 4 == 0 && y % 100 != 0)) ? 366 : 365;
}
int mo[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
inline int query_days_for_month(int m, int y)
{
    //特别注意
    if (m != 2)
        return mo[m];
    else
        if (y % 400 == 0 || (y % 4 == 0 && y % 100 != 0))
            return 29;
        else
            return 28;
}
inline bool chk(char A[], char B[])//替代strcmp
{
    for (int i = 0; i < 8; i++)
        if (A[i] != B[i])
            return 0;
    return 1;
}
inline int tran(int y, int m, int d, char str[])
{
    // #ifdef debug
    // printf("y m d %d %d %d\n", y, m, d);
    // #endif
    if (d > query_days_for_month(m, y))
    {
        d = 1;
        m++;
        #ifdef debug
        printf("m++\n");
        #endif
        if (m > 12)
        {
            m = 1;
            y++;
            #ifdef debug
            printf("y++\n");
            #endif
        }
    }
    str[0] = y / 1000;
    str[1] = y % 1000 / 100;
    str[2] = y % 100 / 10;
    str[3] = y % 10;

    str[4] = m / 10;
    str[5] = m % 10;

    str[6] = d / 10;
    str[7] = d % 10;
    return y*10000 + m*100 + d;
}
int main()
{
    int y1, m1, d1, y2, m2, d2;
    char str1[9], str2[9];
    scanf("%s%s", str1, str2);
    for (int i = 0; i < 8; i++)
    {
        str1[i] -= '0';
        str2[i] -= '0';
    }
    y2 = str2[0]*1000 + str2[1]*100 + str2[2]*10 + str2[3];
    m2 = str2[4]*10 + str2[5];
    d2 = str2[6]*10 + str2[7];

    int sum = 0;
    y1 = str1[0]*1000 + str1[1]*100 + str1[2]*10 + str1[3];
    m1 = str1[4]*10 + str1[5];
    d1 = str1[6]*10 + str1[7];
    while (1)
    {
        for (int i = 0; i < 6; i++)
            if (str1[i+1] - str1[i] == str1[i+2] - str1[i+1])
            {
                sum++;
                break;
            }

        if (chk(str1, str2))
        {
            printf("%d\n", sum);
            return 0;
        }
        //自增
        d1++;
        y1 = tran(y1, m1, d1, str1);
        m1 = (y1 % 10000) / 100;
        d1 = y1 % 100;
        y1 /= 10000;
        #ifdef debug
        printf("p1 %d %d %d\n", y1, m1, d1);
        #endif
    }

    return 0;
}

CC BY-SA 4.0 E.今天也是元气满满的一天 | 2018 校内选拔赛 预选赛 Day2 by 小小泥娃的部落格 is licensed under a Creative Commons Attribution-ShareAlike 4.0 International License.

发表评论