[2020蓝桥杯B组省赛] G-回文日期

题解

  这一题许多小伙伴暴力枚举,其实没有必要,主要还是要看规律。

       首先来看第一个输出答案,其实我们只需要看回文日期的前四个数即可,不足向上加一,满足ABCDDCBA > 输入数据即可。

       然后来看第二个输出答案,其实我们只需要看回文日期的前两个数即可,不足向上加一,满足ABABBABA > 输入数据即可。

       这里的A、B不知是否能相同,我当时把这种情况否了。

#include <iostream>
using namespace std;

const int MAXN = 25;
string s;
int a[MAXN], ans, p1, p2, p3;

void Print(int *a, int ans, int p1, int p2, int p3)
{
    int tmp = p1;
    if (p3 <= p2) {
        tmp++;
    }
    cout << tmp;
    while (tmp) {
        cout << tmp % 10;
        tmp /= 10;
    }
    cout << endl;
    //拆前两个数字
    //20
    int x = p1 / 100;
    if (x / 10 == x % 10) 
        ++x;
    int sum1 = p1 * 10000 + p2;
    //20200202
    //20200000 + 200 + 2 = 20200202
    int sum2 = x * 1000000 + x * 10000 + (x % 10 * 10 + x / 10) * 100 + (x % 10 * 10 + x / 10);
    if (sum1 >= sum2) {
        ++x;
        if (x / 10 == x % 10) 
            ++x;
        sum2 = x * 1000000 + x * 10000 + (x % 10 * 10 + x / 10) * 100 + (x % 10 * 10 + x / 10);        
    }
    cout << sum2 << endl;
}

int main()
{
    cin >> s;
    for (int i = 0; i < s.size(); ++i) {
        a[ans++] = s[i] - '0';
    }
    //p1 前四位
    //p2 后四位
    //p3 前四位的逆序
    p1 = 1000 * a[0] + 100 * a[1] + 10 * a[2] + a[3];
    p2 = 1000 * a[4] + 100 * a[5] + 10 * a[6] + a[7];
    p3 = 1000 * a[3] + 100 * a[2] + 10 * a[1] + a[0];
    Print(a, ans, p1, p2, p3);        
    return 0;
}

最后吐槽一下,当时调了很长时间没调出来(嗯,我觉得和机房的键盘有关),就直接加一了,而且第二个答案的后四个数字还输出反了,吐了呀🤮。

posted @ 2020-10-24 10:51  Fool_one  阅读(2577)  评论(0编辑  收藏  举报