题解-洛谷P2010-回文日期
原题链接: 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-回文日期的更多相关文章
- 洛谷 P2010 回文日期 题解
P2010 回文日期 题目描述 在日常生活中,通过年.月.日这三个要素可以表示出一个唯一确定的日期. 牛牛习惯用88位数字表示一个日期,其中,前44位代表年份,接下来22位代表月 份,最后22位代表日 ...
- 洛谷 P2010 回文日期
Noip2016普及组T2 题目描述 在日常生活中,通过年.月.日这三个要素可以表示出一个唯一确定的日期. 牛牛习惯用8位数字表示一个日期,其中,前4位代表年份,接下来2位代表月 份,最后2位代表日期 ...
- P2010 回文日期
P2010 回文日期 题解 回文日期,一共8位,只需要枚举4位就好了其实,然后判断它是否合法 代码 #include<bits/stdc++.h> using namespace std; ...
- 洛谷 P1217 回文质数
洛谷 P1217 回文质数 链接 https://www.luogu.org/problem/P1217 题目 题目描述 因为 151 既是一个质数又是一个回文数(从左到右和从右到左是看一样的),所以 ...
- P2010 回文日期 题解
这题其实就是纯暴力,暴力,再暴力,毫无技巧可言(总之您怎么乱搞都不会超时QAQ) 首先,根据题意,我们明白每年自多产生一个回文日期,因为对于每年的三百多天,前四位是固定的. 所以,我们只需要进行一个从 ...
- 题解 洛谷 P2010 【回文日期】
By:Soroak 洛谷博客 知识点:模拟+暴力枚举 思路:题目中有提到闰年然后很多人就认为,闰年是需要判断的其实,含有2月29号的回文串,前四位是一个闰年那么我们就可以直接进行暴力枚举 一些小细节: ...
- #P2010 回文日期 的题解
题目描述 在日常生活中,通过年.月.日这三个要素可以表示出一个唯一确定的日期. 牛牛习惯用88位数字表示一个日期,其中,前44位代表年份,接下来22位代表月 份,最后22位代表日期.显然:一个日期只有 ...
- 洛谷P1217回文质数-Prime Palindrome回溯
P1217 [USACO1.5]回文质数 Prime Palindromes 题意:给定一个区间,输出其中的回文质数: 学习了洛谷大佬的回溯写法,感觉自己写回溯的能力不是很强: #include &l ...
- P2010回文日期
这道题是2016年普及组的题,难度等级为普及-. 这道题仍然是个模拟题.有两种策略:1.枚举回文,看日期是否存在2.枚举日期,看是否是回文.显然,前者要快很多,并且准确.本蒟蒻第一次便使用了后者,bu ...
- 洛谷P1435 回文子串
题目背景 IOI2000第一题 题目描述 回文词是一种对称的字符串.任意给定一个字符串,通过插入若干字符,都可以变成回文词.此题的任务是,求出将给定字符串变成回文词所需要插入的最少字符数. 比如 “A ...
随机推荐
- django-模板之extends(三)
/book/base.html <!DOCTYPE html> <html lang="en"> <head> <meta charset ...
- 消息中间件-RabbitMQ环境搭建
一直在传统行业工作(早九晚五不加班),没有考虑消息中间件的性能,所以一直再用activeMQ也没有想过学习别的中间件,时间长也没什么技术上的进步,而且感觉到了 工作的麻木,所以决定学一些新的技术(其实 ...
- Ubuntu编译安装nginx以及配置自动启动
本文主要介绍ubuntu如何编译安装nginx以及遇到的问题 和 配置系统自动启动服务 查看操作系统版本 cat /etc/issue Ubuntu 18.04.3 LTS \n \l 更改镜 ...
- ApplicationContextAware使用理解
接口的作用 当一个类实现了这个接口(ApplicationContextAware)之后,Aware接口的Bean在被初始之后,可以取得一些相对应的资源,这个类可以直接获取spring 配置文件中 所 ...
- Django的下载与基本命令
1.下载Django: pip3 install django==2.1.2 2.创建一个django project django-admin startproject 项目名称 3.在项目目录下创 ...
- java中的时区转换
目录 java中的时区转换 一.时区的说明 二.时间的表示 三.时间戳 四.Date类和时间戳 五.java中的时区转换 java中的时区转换 一.时区的说明 地球表面按经线从东到西,被划成一个个区域 ...
- Web for pentester_writeup之SQL injections篇
Web for pentester_writeup之SQL injections篇 SQL injections(SQL注入) Example 1 测试参数,添加 and '1'='1, 'and ' ...
- Linux基础指令--韩顺平老师课程笔记
一.vi和vim编辑器 ①.三种模式 所有的 Linux 系统都会内建 vi 文本编辑器.vim 具有程序编辑的能力,可以看做是 vi 的增强版本,可以主动的以字体颜色辨别语法的正确性,方便程序设计. ...
- IP网段的判断
一. OSI七层模型 表示 说明 作用 应用层 HTTP.ftp 协议 表示层 UTF-8 将应用层协议翻译成计算机可识别的语言 会话层 管理传输层 传输层 TCP/UDP 建立以及断开连接 网 ...
- len、is、==、可变于不可变类型
a="asdfghjkl;'iuygb" b="小米" c=['a','b','c'] d= {'name':1,'age':24} # len统计字符或元素的 ...