回文日期(NOIP2016)
题目:回文日期
这题虽然说不难,但是也不能算水了。
我先讲讲思路。60分的算法很好写,就是判断一下是不是回文串,分离每个数位,判断即可。
但我们的目标是满分,所以我来讲讲满分算法。
首先,给的是区间,那么,难免的,我们需要去枚举,但是怎么枚举?
一天一天的加然后判断?想想都可怕,一定不是这样。那么是怎样的呢?
考虑到,一共八位,回文需要前后四位对称,所以,日期不行,我们对称过去,是什么?年!我们以年为单位枚举,就要少了很多无用的枚举。
所以我们的思路是,枚举两个年限之间的每个年(包括端点),然后对称得到月日,判断是否符合日期规则就行了,同时还要注意,在端点年,要判断日期是否在区间内。
下面看代码:
#include<bits/stdc++.h>
using namespace std;
int aa[8],bb[8],cc[4];
int main(){
int a,b;
scanf("%d%d",&a,&b);
int ans=0;
int ya=(a-a%10000)/10000; //1
int yb=(b-b%10000)/10000;
for(int i=0;i<8;i++){ //2
aa[i]=a%10;
a/=10;
bb[i]=b%10;
b/=10;
}
int ma=aa[3]*10+aa[2]; //3
int mb=bb[3]*10+aa[2];
int da=aa[1]*10+aa[0];
int db=bb[1]*10+bb[0];
for(int i=ya;i<=yb;i++){ //4
int x=i;
for(int j=0;j<4;j++){ //5
cc[j]=x%10;
x/=10;
}
int mon=cc[0]*10+cc[1]; //6
int day=cc[2]*10+cc[3];
//特判
if(i==ya){ //7
if(!((mon>ma)||(mon==ma&&day>=da))){
continue;
}
}else if(i==yb){
if(!((mon<mb)||(mon==mb&&day<=db))){
continue;
}
}
if(mon>=1&&mon<=12){ //8
if(mon==1||mon==3||mon==5||mon==7||mon==8||mon==10||mon==12){
if(day>=1&&day<=31){
ans++;
}
}else if(mon==2){
if((i%4==0&&i%100!=0)||i%400==0){
if(day>=1&&day<=29){
ans++;
}
}else{
if(day>=1&&day<=28){
ans++;
}
}
}else{
if(day>=1&&day<=30){
ans++;
}
}
}
}
printf("%d",ans);
return 0;
}
代码中标了8个位置,我们下面讲一下。
1处:计算端点年。用取模实现。
2处:将输入日期数位分离,便于3计算。
3处:计算端点月份和日期,便于7处的特判。
4处:枚举闭区间之间的每个年份。
5处:对于每一个枚举的年份,分离数位,便于计算对称后的月和日。
6处:计算对称后的月和日。
7处:特判,如果是端点值,在此判断是否在区间时间内,如果不是,跳过此次循环,如果是继续向下。
8处:依次判断月和日是否合法,月在1到12之间,还要依据月判断时间,注意闰年,就行了。
回文日期(NOIP2016)的更多相关文章
- [洛谷] P2010 [NOIP2016 普及组] 回文日期
点击查看代码 #include<bits/stdc++.h> using namespace std; int data1, data2, ans = 0, sum; int d[13] ...
- 洛谷 P2010 回文日期
Noip2016普及组T2 题目描述 在日常生活中,通过年.月.日这三个要素可以表示出一个唯一确定的日期. 牛牛习惯用8位数字表示一个日期,其中,前4位代表年份,接下来2位代表月 份,最后2位代表日期 ...
- P2010 回文日期 题解
这题其实就是纯暴力,暴力,再暴力,毫无技巧可言(总之您怎么乱搞都不会超时QAQ) 首先,根据题意,我们明白每年自多产生一个回文日期,因为对于每年的三百多天,前四位是固定的. 所以,我们只需要进行一个从 ...
- NOIP 普及组 2016 回文日期
传送门 https://www.cnblogs.com/violet-acmer/p/9859003.html 题解: 思路1: 相关变量解释: year1,month1,day1 : date1对应 ...
- NOIP 2016 回文日期
洛谷P2010 https://www.luogu.org/problemnew/show/P2010 JDOJ 3313 https://neooj.com:8082/oldoj/problem.p ...
- 洛谷 P2010 回文日期 题解
P2010 回文日期 题目描述 在日常生活中,通过年.月.日这三个要素可以表示出一个唯一确定的日期. 牛牛习惯用88位数字表示一个日期,其中,前44位代表年份,接下来22位代表月 份,最后22位代表日 ...
- 洛谷 题解 P2010 【回文日期】
因为有8个字符,所以可得出每一年只有一个回文日期. 因此只要判断每一年就行了. 做法: 我们先把年倒过来,例如2018年就倒为8102,就得出8102就是回文日期的后四个字符,我们只要判断一下有没有这 ...
- P2010 回文日期
P2010 回文日期 题解 回文日期,一共8位,只需要枚举4位就好了其实,然后判断它是否合法 代码 #include<bits/stdc++.h> using namespace std; ...
- NOIP【2016普及组】 考后有感(买铅笔,回文日期,海港,魔法阵)
普及组考试已落下大幕,但我们那扑通扑通等待成绩的心仍然无法平静,先来给四道题做一个总结: 一. 买铅笔 自评难度:1星 其实这道题没有什么难度,生命之题,满分必拿,100分,保底啦~\(≧▽≦)/~ ...
随机推荐
- python中的命名元组namedtuple
namedtuple是继承自tuple的子类.namedtuple创建一个和tuple类似的对象,而且对象拥有可访问的属性 可利用collections.namedtuple构建一个简单的类. fro ...
- Centos7 下的NTP-server(Chorny) 部署及客户端时间同步配置
一.介绍 1.本博客以 ceph 集群搭建时的NTP-server 为例. 2.hosts # vim /etc/hosts 10.6.32.20 ceph1 (作为时间服务器) 10. ...
- TOJ1302: 简单计算器 && TOJ 4873: 表达式求值&&TOJ3231: 表达式求值
这些都是应用Python的eval函数的一些题目! TOJ1302传送门:http://acm.tzc.edu.cn/acmhome/problemdetail.do?&method=show ...
- Toolbar 工具栏 菜单 标题栏 Menu
要使用Toolbar,要先将标题栏(ActionBar)关掉: style.xml中:<style name="MainActivityTheme" parent=" ...
- Angular之模版引用变量
A template reference variable is often a reference to a DOM element within a template. It can also b ...
- Chrome控制台格式化输出
一 格式化输出文字 console.log('%c你好','color:green;'); console.log('%c你好%c啊','color:green;','color:blue;'); 二 ...
- TZOJ 3665 方格取数(2)(最大点权独立集)
描述 给你一个m*n的格子的棋盘,每个格子里面有一个非负数. 从中取出若干个数,使得任意的两个数所在的格子没有公共边,就是说所取数所在的2个格子不能相邻,并且取出的数的和最大. 输入 包括多个测试实例 ...
- 项目总结11:Centos部署JDK+Tomcat+MySQL文档(阿里云-网易云-华为云)
(如果不是root登陆,则输入:sudo su - 切换成root) 1.JDK安装 1-1-yum update (升级所有包同时也升级软件和系统内核) --安装中会有提示输入y就好(两个y,中 ...
- 总结函数open与fopen的区别
转自:https://www.zybuluo.com/yiltoncent/note/87461 对于这两个名字很类似的函数,对于很多初学者来说,不容易搞清楚它们有什么不同,只知道按照函数用法使用.如 ...
- 前端基础之JavaScript day51
前端基础之JavaScript JavaScript概述 JavaScript的历史 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中) ...