首页 > 其他分享 >[NOIP2016 普及组] 回文日期

[NOIP2016 普及组] 回文日期

时间:2022-12-29 14:23:36浏览次数:47  
标签:NOIP2016 普及 10 int 样例 ++ 日期 回文

[NOIP2016 普及组] 回文日期

题目背景

NOIP2016 普及组 T2

题目描述

在日常生活中,通过年、月、日这三个要素可以表示出一个唯一确定的日期。

牛牛习惯用 \(8\) 位数字表示一个日期,其中,前 \(4\) 位代表年份,接下来 \(2\) 位代表月份,最后 \(2\) 位代表日期。显然:一个日期只有一种表示方法,而两个不同的日期的表 示方法不会相同。

牛牛认为,一个日期是回文的,当且仅当表示这个日期的 \(8\) 位数字是回文的。现在,牛牛想知道:在他指定的两个日期之间包含这两个日期本身),有多少个真实存在的日期是回文的。

一个 \(8\) 位数字是回文的,当且仅当对于所有的 \(i\)(\(1 \le i \le 8\))从左向右数的第 \(i\) 个数字和第 \(9-i\) 个数字(即从右向左数的第 \(i\) 个数字)是相同的。

例如:

  • 对于 2016 年 11 月 19 日,用 \(8\) 位数字 \(20161119\) 表示,它不是回文的。
  • 对于 2010 年 1 月 2 日,用 \(8\) 位数字 \(20100102\) 表示,它是回文的。
  • 对于 2010 年 10 月 2 日,用 \(8\) 位数字 \(20101002\) 表示,它不是回文的。

每一年中都有 \(12\) 个月份:

其中,\(1, 3, 5, 7, 8, 10, 12\) 月每个月有 \(31\) 天;\(4, 6, 9, 11\) 月每个月有 \(30\) 天;而对于 \(2\) 月,闰年时有 \(29\) 天,平年时有 \(28\) 天。

一个年份是闰年当且仅当它满足下列两种情况其中的一种:

  1. 这个年份是 \(4\) 的整数倍,但不是 \(100\) 的整数倍;
  2. 这个年份是 \(400\) 的整数倍。

例如:

  • 以下几个年份都是闰年:\(2000, 2012, 2016\)。
  • 以下几个年份是平年:\(1900, 2011, 2014\)。

输入格式

两行,每行包括一个 \(8\) 位数字。

第一行表示牛牛指定的起始日期。

第二行表示牛牛指定的终止日期。

保证 \(\mathit{date}_1\) 和 \(\mathit{date}_2\) 都是真实存在的日期,且年份部分一定为 \(4\) 位数字,且首位数字不为 \(0\)。

保证 \(\mathit{date}_1\) 一定不晚于 \(\mathit{date}_2\)。

输出格式

一个整数,表示在 \(\mathit{date}_1\) 和 \(\mathit{date}_2\) 之间,有多少个日期是回文的。

样例 #1

样例输入 #1

20110101
20111231

样例输出 #1

1

样例 #2

样例输入 #2

20000101
20101231

样例输出 #2

2

样例 #3

样例输入 #3

20211202
20211202

样例输出 #3

1

样例 #4

样例输入 #4

40110123
98900301

样例输出 #5

214

提示

【样例说明】

对于样例 1,符合条件的日期是 \(20111102\)。

对于样例 2,符合条件的日期是 \(20011002\) 和 \(20100102\)。

【子任务】

对于 \(60 \%\) 的数据,满足 \(\mathit{date}_1 = \mathit{date}_2\)。

solve

code

#include <bits/stdc++.h>
// #define ONLINE_JUDGE
#define fi first
#define se second
#define pb push_back
#define ppb pop_back
#define mp make_pair
#define SZ(v) ((int)v.size())
#define FAST ios::sync_with_stdio(false), cin.tie(0), cout.tie(0)
typedef long long ll;
typedef unsigned int u32;
typedef unsigned long long u64;
typedef double db;
using namespace std;

int d[13] = {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};
int yr1, yr2, m1, m2, d1, d2;
int cnt;

bool check() {
    if(yr1 == yr2 && m1 == m2 && d1 == d2) return true;
    return false;
}

bool huiwen(int a, int b, int c) {
    int x = a * 10000 + b * 100 + c;
    int t = 0;
    string s = to_string(x);
    while(a) {
        a /= 10;
        t++;
    }    
    for(int i = 0; i < 4-t; i++) s = "0" + s;
    for(int i = 0, j = SZ(s)-1; i < j; i++, j--) {
        if(s[i] != s[j]) return false;
    }
    return true;
}

void run(int y) {
    if((y % 4 == 0 && y % 100 != 0) || y % 400 == 0) d[2] = 29;
    else d[2] = 28;
}

void f() {
    ++d1;
    if(d1 > d[m1]) {
        d1 = 1;
        ++m1;
        if(m1 > 12) {
            yr1++;
            m1 = 1;
            run(yr1);
        }
    }
}

void ff() {
    ++d2;
    if(d2 > d[m2]) {
        d2 = 1;
        ++m2;
        if(m2 > 12) {
            yr2++;
            m2 = 1;
        }
    }
}


void solve() {
    string a, b;
    cin >> a >> b;
    yr1 = (a[0]-'0') * 1000 + (a[1]-'0') * 100 + (a[2]-'0')*10+ (a[3]-'0');
    yr2 = (b[0]-'0') * 1000 + (b[1]-'0') * 100 + (b[2]-'0')*10+ (b[3]-'0');
    m1 = (a[4]-'0') * 10 + (a[5]-'0');
    m2 = (b[4]-'0')*10+ (b[5]-'0');
    d1 = (a[6]-'0')*10+ (a[7]-'0');
    d2 = (b[6]-'0')*10+ (b[7]-'0');
    run(yr1);
    ff();
    while(!check()){
        if(huiwen(yr1, m1, d1)) {
            cnt++;
        }
        f();
    }
    cout << cnt << "\n";
}

int main() {
    FAST;       
    solve();
    return 0;
}

标签:NOIP2016,普及,10,int,样例,++,日期,回文
From: https://www.cnblogs.com/zhyyyyy115/p/17012411.html

相关文章

  • P1036 [NOIP2002 普及组] 选数(DFS + 不降原则)
    P1036[NOIP2002普及组]选数题意​ 在n个数里选k个数,有多少中选法,使得选出来的数的和为素数。不能重复选。思路​ n很小,直接爆搜,但是如果不使用不降原则的话,就......
  • 57. 回文字符串——递归
    57.回文字符串——递归   有一种特殊形式的字符串,其正反序相同,被称为“回文字符串”。例如LeveL就是一个回文字符串。输入:        字符串输出:   ......
  • P1044 [NOIP2003 普及组] 栈
    题目背景栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表。栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈)。栈的重要......
  • 回文相关
    求最长回文串:回文子串的最大长度AC代码:(字符串hash解决)#include<bits/stdc++.h>usingULL=unsignedlonglong;constexprintP=131;chars[2000010];ULL......
  • [NOIP2009 普及组] 多项式输出
    [NOIP2009普及组]多项式输出题目描述一元$n$次多项式可用如下的表达式表示:$$f(x)=a_nxn+a_{n-1}x{n-1}+\cdots+a_1x+a_0,a_n\ne0$$其中,$a_ix^i$称为$i$次项,$a......
  • leetcode-回文数
    9.回文数给你一个整数x,如果x是一个回文整数,返回true;否则,返回false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121是回文,而123不是。示例1......
  • R7-1 判断回文字符串
    R7-1判断回文字符串分数 15全屏浏览题目切换布局作者 颜晖-历年试卷单位 浙大城市学院输入一个字符串,判断该字符串是否为回文。回文就是......
  • [LeetCode]009-回文数
    >>>传送门题目给你一个整数x,如果x是一个回文整数,返回true;否则,返回false。回文数是指正序(从左向右)和倒序(从右向左)读都是一样的整数。例如,121是回文,而123不......
  • leetcode-最长回文子串
    给你一个字符串s,找到s中最长的回文子串。如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。 示例1:输入:s="babad"输出:"bab"解释:"aba"同样是符合题意的答......
  • 回文自动机,PAM
    回文自动机。或者叫回文树。这坑我放了一百年没填了。结构回文自动机的每个节点都代表一个回文子串。它有两个起始状态:奇根和偶根。它们是奇回文串和偶回文串的起点,不代......