Bootstrap

洛谷 P2010 [NOIP2016 普及组] 回文日期

P2010 [NOIP2016 普及组] 回文日期

相比于枚举区间内所有字符串来判断是不是回文串,不如构造一个回文串,判断它是不是合法且在给定区间内

构造回文串可以由前四位生成后四位,也可以后四位生成前四位。后者比较方便,因为生成的回文串一定合法(不用判断闰年,因为0229反过来就是9220为闰年,其余日期都很普通不用判断)。

当生成的回文串一定合法时,只要单纯进行值的比较就可以判断是否在区间内了(n <= x <= m)

Code:

#include <iostream>

using namespace std;

int n, m;//两个八位的截止日期
int cnt;//统计回文串的数量
int s[13] = {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

int main()
{
    cin >> n >> m;
    
    for(int i = 1; i <= 12; i ++ )//构造回文串
    {
        for(int j = 1; j <= s[i]; j ++ )
        {
            int x2 = i * 100 + j;
            int x1 = x2 % 10 * 1000 + x2 % 100 / 10 * 100 + x2 % 1000 / 100 * 10 + x2 / 1000;
            int res = x1 * 10000 + x2;
            if(res >= n && res <= m) cnt ++ ;
        }
    }

    cout << cnt << endl;

    // system("pause");
    return 0;
}

;