原题链接: https://www.luogu.org/problem/P2010

题目简述:

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

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

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

例如:

  • 对于2016年11月19日,用88位数字20161119表示,它不是回文的。

  • 对于2010年1月2日,用88位数字20100102表示,它是回文的。

  • 对于2010年10月2日,用88位数字20101002表示,它不是回文的。

算出两个日期之间所有的回文日期。

思路:

  • 回文日期要是真实存在的 (这还用我说吗??)
  • 最后一组是极限数据,大概像这样:
10010101
99991231

循环枚举肯定会超时

  • 所以需要通过枚举日期来”制造回文“,类似与这样:

1999年中的回文日期应该是: 19999991 虽然它是不存在的

2010年中的回文日期应该是: 20100102

代码:

#include <bits/stdc++.h>
using namespace std;
int a,b,c,d;
int e,f;
bool runnian(int year) {
if(year%100==0) {
if(year%400==0) {
return 1;
}
return 0;
}//千禧年特判
else {
if(year%4==0) {
return 1;
}
return 0;
}
}
bool judge(int n) {
if(n==1||n==3||n==5||n==7||n==8||n==10||n==12) {
return 1;
}
return 0;
}
bool in(int year,int month,int day) {
if(year>d||year<a) {
return 0;
}
//——————————————————
if(year==a&&month<b) {
return 0;
}
if(year==a&&day>c&&month==b) {
return 0;
}
if(month==0||day==0||year==0) {
return 0;
}
//————————————————————-
if(year==d&&month>e) {
return 0;
}
if(year==d&&day>f&&month==e) {
return 0;
}
if(month>=13) {
return 0;
}
if(day>=32) {
return 0;
}
if(month==2) {
if(day>28&&(!runnian(year))) {
return 0;
}
if(day>29&&(runnian(year))) {
return 0;
}
return 1;
} else {
if(day>31&&judge(month)) {
return 0;
}
if(day>30&&!judge(month)) {
return 0;
}
return 1;
}
}
int main() {
string n,m;
cin>>n>>m;
a = atoi(n.substr(0,4).c_str());
b = atoi(n.substr(4,2).c_str());
c = atoi(n.substr(6,2).c_str());
d = atoi(m.substr(0,4).c_str());
e = atoi(m.substr(4,2).c_str());
f = atoi(m.substr(6,2).c_str());
int year = a;
int month = b;
int day = c;
int ans = 0;
for(int i = year;i<=d;++i) {
int o,p,q;
o = year;
string a;
stringstream ss;
ss<<year;
ss>>a;
char b[101010];
int len = 0;
for(int i = a.length()-1;i>=0;--i) {
b[len] = a[i];
len++;
}
string c(b);
p = atoi(c.substr(0,2).c_str());
q = atoi(c.substr(2,2).c_str());
year++;
if(in(o,p,q)) {
ans++;
}
}
cout<<ans<<endl;
}

题解-洛谷P2010-回文日期的更多相关文章

  1. 洛谷 P2010 回文日期 题解

    P2010 回文日期 题目描述 在日常生活中,通过年.月.日这三个要素可以表示出一个唯一确定的日期. 牛牛习惯用88位数字表示一个日期,其中,前44位代表年份,接下来22位代表月 份,最后22位代表日 ...

  2. 洛谷 P2010 回文日期

    Noip2016普及组T2 题目描述 在日常生活中,通过年.月.日这三个要素可以表示出一个唯一确定的日期. 牛牛习惯用8位数字表示一个日期,其中,前4位代表年份,接下来2位代表月 份,最后2位代表日期 ...

  3. P2010 回文日期

    P2010 回文日期 题解 回文日期,一共8位,只需要枚举4位就好了其实,然后判断它是否合法 代码 #include<bits/stdc++.h> using namespace std; ...

  4. 洛谷 P1217 回文质数

    洛谷 P1217 回文质数 链接 https://www.luogu.org/problem/P1217 题目 题目描述 因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 ...

  5. P2010 回文日期 题解

    这题其实就是纯暴力,暴力,再暴力,毫无技巧可言(总之您怎么乱搞都不会超时QAQ) 首先,根据题意,我们明白每年自多产生一个回文日期,因为对于每年的三百多天,前四位是固定的. 所以,我们只需要进行一个从 ...

  6. 题解 洛谷 P2010 【回文日期】

    By:Soroak 洛谷博客 知识点:模拟+暴力枚举 思路:题目中有提到闰年然后很多人就认为,闰年是需要判断的其实,含有2月29号的回文串,前四位是一个闰年那么我们就可以直接进行暴力枚举 一些小细节: ...

  7. #P2010 回文日期 的题解

    题目描述 在日常生活中,通过年.月.日这三个要素可以表示出一个唯一确定的日期. 牛牛习惯用88位数字表示一个日期,其中,前44位代表年份,接下来22位代表月 份,最后22位代表日期.显然:一个日期只有 ...

  8. 洛谷P1217回文质数-Prime Palindrome回溯

    P1217 [USACO1.5]回文质数 Prime Palindromes 题意:给定一个区间,输出其中的回文质数: 学习了洛谷大佬的回溯写法,感觉自己写回溯的能力不是很强: #include &l ...

  9. P2010回文日期

    这道题是2016年普及组的题,难度等级为普及-. 这道题仍然是个模拟题.有两种策略:1.枚举回文,看日期是否存在2.枚举日期,看是否是回文.显然,前者要快很多,并且准确.本蒟蒻第一次便使用了后者,bu ...

  10. 洛谷P1435 回文子串

    题目背景 IOI2000第一题 题目描述 回文词是一种对称的字符串.任意给定一个字符串,通过插入若干字符,都可以变成回文词.此题的任务是,求出将给定字符串变成回文词所需要插入的最少字符数. 比如 “A ...

随机推荐

  1. django-模板之extends(三)

    /book/base.html <!DOCTYPE html> <html lang="en"> <head> <meta charset ...

  2. 消息中间件-RabbitMQ环境搭建

    一直在传统行业工作(早九晚五不加班),没有考虑消息中间件的性能,所以一直再用activeMQ也没有想过学习别的中间件,时间长也没什么技术上的进步,而且感觉到了 工作的麻木,所以决定学一些新的技术(其实 ...

  3. Ubuntu编译安装nginx以及配置自动启动

    本文主要介绍ubuntu如何编译安装nginx以及遇到的问题 和 配置系统自动启动服务 查看操作系统版本 cat /etc/issue  Ubuntu 18.04.3 LTS \n \l    更改镜 ...

  4. ApplicationContextAware使用理解

    接口的作用 当一个类实现了这个接口(ApplicationContextAware)之后,Aware接口的Bean在被初始之后,可以取得一些相对应的资源,这个类可以直接获取spring 配置文件中 所 ...

  5. Django的下载与基本命令

    1.下载Django: pip3 install django==2.1.2 2.创建一个django project django-admin startproject 项目名称 3.在项目目录下创 ...

  6. java中的时区转换

    目录 java中的时区转换 一.时区的说明 二.时间的表示 三.时间戳 四.Date类和时间戳 五.java中的时区转换 java中的时区转换 一.时区的说明 地球表面按经线从东到西,被划成一个个区域 ...

  7. Web for pentester_writeup之SQL injections篇

    Web for pentester_writeup之SQL injections篇 SQL injections(SQL注入) Example 1 测试参数,添加 and '1'='1, 'and ' ...

  8. Linux基础指令--韩顺平老师课程笔记

    一.vi和vim编辑器 ①.三种模式 所有的 Linux 系统都会内建 vi 文本编辑器.vim 具有程序编辑的能力,可以看做是 vi 的增强版本,可以主动的以字体颜色辨别语法的正确性,方便程序设计. ...

  9. IP网段的判断

    一.    OSI七层模型 表示 说明 作用 应用层 HTTP.ftp 协议 表示层 UTF-8 将应用层协议翻译成计算机可识别的语言 会话层 管理传输层 传输层 TCP/UDP 建立以及断开连接 网 ...

  10. len、is、==、可变于不可变类型

    a="asdfghjkl;'iuygb" b="小米" c=['a','b','c'] d= {'name':1,'age':24} # len统计字符或元素的 ...