洛谷 NOIP2016 普及组 回文日期 + 洛谷 NOIP2017 图书管理员

回文日期这题目本来是不难想思路的。。。。。。

然而我第一次做的时候改了蛮久才把代码完全改对,主要感觉还是不够细心,敲的时候也没注意见检查一些小错误,那么接下来不说废话,请看题干:

接下来请看输入输出的样例以及数据范围:

我提供两个方法去做这个题,第一个思路是:

首先我们分析容易看出输入的日期其实当作两个八位数处理即可,然后直接循环,从起始日期到截止日期,如果是回文日期,直接ans++即可,只是我们需要思考如何来让日期进行正确的进位,所以这时候我考虑使用函数来达到目的的功能,接下来请看代码:

#include<bits/stdc++.h>
using namespace std;
int d1,d2,ans;
int getday(int y,int m){
	//y年m月有多少天
	if(m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12)
	return 31;
	if(m==4 || m==6 || m==9 || m==11)
    return 30;
    //判断闰年
    if(( !(y%4) && y%100) || !(y%400))
    return 29;
    else 
	return 28;
}
int nextday(int x){
	//x的下一天  表示为八位整数
	int y=x/10000;
	int m=x/100%100;
	int d=x%100;
	if(d != getday(y,m))
	++d;
	else if(m!=12){
		++m;
		d=1;
	}
	else {
		y+=1;
		m=1;
		d=1;
	}
	return 10000*y+100*m+d;
}
int rev(int x){
	int ans=0;
	while(x){
		ans=ans*10+x%10;
		x/=10;
	}
	return ans;
}
int main(){
	scanf("%d%d",&d1,&d2);
	for(int d=d1;d<=d2;d=nextday(d)){
		if(d == rev(d)) ans++;
	}
    printf("%d\n",ans);
	return 0;
}

 看起来很长其实也并不复杂,写了几个函数,第一个函数是判断对应的月份有多少天,第二个是判断循环中的下一天的日期,第三个循环判断翻转数字是否与一开始的一样,也就是判断回文数,然后就是很简单的输入和枚举,相信不必进行解释了。

接下来我就在思考,很明显一开始的方法还是进行了很多不必要的循环,两个回文日期的间隔一般是比较大的,所以有很多不必要的循环,也就是我考虑如何降低循环的次数,同时也能降低时间复杂度,接下来请看代码:

#include<bits/stdc++.h>
using namespace std;
int d1,d2,ans;
int getday(int y,int m){
	//y年m月有多少天
	if(m==1 || m==3 || m==5 || m==7 || m==8 || m==10 || m==12)
	return 31;
	if(m==4 || m==6 || m==9 || m==11)
    return 30;
    //判断闰年
    if(( !(y%4) && y%100) || !(y%400))
    return 29;
    else 
	return 28;
}
int nextday(int x){
	//x的下一天  表示为八位整数
	int y=x/10000;
	int m=x/100%100;
	int d=x%100;
	if(d != getday(y,m))
	++d;
	else if(m!=12){
		++m;
		d=1;
	}
	else {
		y+=1;
		m=1;
		d=1;
	}
	return 10000*y+100*m+d;
}
int rev(int x){
	int ans=0;
	while(x){
		ans=ans*10+x%10;
		x/=10;
	}
	return ans;
}
int main(){
	scanf("%d%d",&d1,&d2);
    for(int y=1000;y<=9999;y++){
    	int revy=rev(y);
    	int m=revy/100;
    	int d=revy%100;
    	if(m>=1 && m<=12 && d>=1 && d<=getday(y,m)){
    		int x=y*10000+revy;
    		if(x>=d1 && x<=d2) ans++;
		}
	}
	printf("%d\n",ans);
	return 0;
}

这个方法就是将年份进行了循环,从1000循环到9999年,每次循环先判断出是否是回文年份并且这个回文年份是否在输入的起始日期和截止日期之间,如果在,那么就可以ans++,这是因为我们可以发现日期是一个八位数字,并且由于年份、月份和日子都不可以为0,所以我们其实可以把年份看成特殊进位的数字,进而只需要循环一万次不到就可以得到结果。

看第二道题:图书管理员:

接下来看输入输出以及测试案例以及数据范围:
 这道题目因为数据范围比较小,所以没什么难度,直接暴力枚举就可以了,直接两重循环来枚举,看每个借书的是否能从图书馆里面的书找到自己需要的相匹配即可,这个可以通过函数来进行实现,不过由于当多本书满足的时候优先输出编号小的,所以可以先对书的编号按照从小到大的顺序进行排序,话不多说代码如下:

#include<iostream>
#include<algorithm>
using namespace std;
int n,q;
int book[1010],a[1010],l[1010];
bool pd(int x,int y,int z){
	int b[11];
	int t=1;
	while(y--){
		b[t]=x%10;
		x/=10;
		if(z%10!=b[t]){
			return false;
		}
		z/=10;
		++t;  
	}
	return true;
}
int main(){
	cin>>n>>q;
	for(int i=1;i<=n;i++)
	cin>>book[i];
	sort(book+1,book+n+1);
	for(int i=1;i<=q;i++)
	cin>>l[i]>>a[i];
	for(int i=1;i<=q;i++){
		int k=-1;
	    for(int j=1;j<=n;j++){
	    	if(pd(book[j],l[i],a[i])){
	    	cout<<book[j]<<endl;
			k=1;
			break;
			}
		}
		if(k==-1) cout<<k<<endl;
		else k=-1;	
	}
	return 0;
}

我和一个同学都做了这个题,接下来我展示一下他的代码:

#include<bits/stdc++.h>
using namespace std;
int n,q;
int a[1100];
int main(){
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++)
	scanf("%d",&a[i]);
	for(int i=1;i<=q;i++){
		int l,b;
		scanf("%d%d",&l,&b);
		int pw=1;
		for(int j=0;j<l;j++)
		pw*=10;
		int ans=-1;
		for(int j=1;j<=n;j++)
		if(a[j]%pw==b){
			if(ans==-1 || a[j]<ans){
				ans=a[j];
			}
		}
		printf("%d\n",ans);
	}
	return 0;
}

不得不承认他的代码更加的简洁,思路大致就是利用a数组来存每一本图书的编号,然后由于有q个人去借书,同样是枚举然后进行判断是否能借到自己想要的书本,引用了ans作为中间变量,未使用排序,从第一本书枚举到了最后一本书,当遇见能够匹配的书时,如果ans的值还没有改变也就是为-1,那么就将ans赋值为对应编号,如果在后面找到了更小的编号得到匹配就更新ans,最后如果没有找到能匹配的书籍由于ans的初始值为-1只需要直接输出ans即可。

两种方法其实都是暴力枚举,读者可以根据自己的习惯来进行挑选。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/266600.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【机器学习】模式识别

1 概述 模式识别&#xff0c;简单来讲&#xff0c;就是分类问题。 模式识别应用&#xff1a;医学影像分析、人脸识别、车牌识别、遥感图像 2 模式分类器 分类器的分类&#xff1a;线性分类器、非线性分类器、最近邻分类器 2.1 分类器的训练&#xff08;学习&#xff09;过…

Stable Diffusion系列(三):网络分类与选择

文章目录 网络分类模型基座模型衍生模型二次元模型2.5D模型写实风格模型 名称解读 VAELora嵌入文件放置界面使用 网络分类 当使用SD webui绘图时&#xff0c;为了提升绘图质量&#xff0c;可以多种网络混合使用&#xff0c;可选的网络包括了模型、VAE、超网络、Lora和嵌入。 …

使用minio实现大文件断点续传

部署 minio 拉取镜像 docker pull minio/minio docker images新建映射目录 新建下面图片里的俩个目录 data(存放对象-实际的数据) config 存放配置开放对应端口 我使用的是腾讯服务器所以 在腾讯的安全页面开启 9000&#xff0c;9090 两个端口就可以了&#xff08;根据大家实际…

数据权限篇

文章目录 1. 如何实现数据权限&#xff08;内核&#xff09;1.1 原理1.2 源码实现&#xff0c;mybatis如何重写sql1.2.1 重写sql1.2.2 解析sql1.2.3 DataPermissionDatabaseInterceptor 1. 如何实现数据权限&#xff08;内核&#xff09; 1.1 原理 面对复杂多变的需求&#xf…

二叉树进阶题目(超详解)

文章目录 前言根据二叉树创建字符串题目分析写代码 二叉树的层序遍历题目分析 写代码二叉树的层序遍历II题目分析写代码 二叉树的最近公共祖先题目分析写代码时间复杂度 优化思路优化的代码 二叉搜索树与双向链表题目分析写代码 从前序与中序遍历序列构造二叉树题目分析写代码从…

python实现bp神经网络对csv文件进行数据预测

参考资源&#xff1a; sklearn库 bp神经网络[从原理到代码一篇搞定]&#xff08;2&#xff09;_sklearn 神经网络-CSDN博客 十分钟上手sklearn&#xff1a;安装&#xff0c;获取数据&#xff0c;数据预处理 - 知乎 (zhihu.com) 一个实例讲解如何使用BP神经网络(附代码) - 知…

VSCode软件与SCL编程

原创 NingChao NCLib 博途工控人平时在哪里技术交流博途工控人社群 VSCode简称VSC&#xff0c;是Visual studio code的缩写&#xff0c;是由微软开发的跨平台的轻量级编辑器&#xff0c;支持几乎所有主流的开发语言的语法高亮、代码智能补全、插件扩展、代码对比等&#xff0c…

【Python】贪心算法入门

一.引言 本文将通过两个问题和两道例题带你入门贪心算法。 贪心算法&#xff08;Greedy Algorithm&#xff09;是一种在每一步选择中都采取在当前状态下最优&#xff08;最好或最有利&#xff09;的选择&#xff0c;从而希望导致全局最优解的算法。贪心算法不保证找到全局最优…

STM32——CAN协议

文章目录 一.CAN协议的基本特点1.1 特点1.2 电平标准1.3 基本的五个帧1.4 数据帧 二.数据帧解析2.1 帧起始和仲裁段2.2 控制段2.3 数据段和CRC段2.4 ACK段和帧结束 三.总线仲裁四.位时序五.STM32CAN控制器原理与配置5.1 STM32CAN控制器介绍5.2 CAN的模式5.3 CAN框图 六 手册寄存…

w15初识php基础

一、计算100之内的偶数之和 实现思路 所有的偶数除2都为0 代码实现 <?php # 记录100以内的偶数和 $number1; $num0; while($number<100){if($number%20){ $num$number;}$number1; } echo $num; ?>输出的结果 二、计算100之内的奇数之和 实现思路 所有的奇数除…

JavaScript常用技巧专题四

文章目录 一、使用箭头函数简化函数定义二、使用解构赋值简化变量声明三、使用模板字面量进行字符串拼接四、使用展开运算符进行数组和对象操作五、使用数组的高阶方法简化循环和数据操作六、使用条件运算符简化条件判断七、使用对象解构和默认参数简化函数参数八、使用函数式编…

7. 行为模式 - 状态模式

亦称&#xff1a; State 意图 状态模式是一种行为设计模式&#xff0c; 让你能在一个对象的内部状态变化时改变其行为&#xff0c; 使其看上去就像改变了自身所属的类一样。 问题 状态模式与有限状态机 的概念紧密相关。 有限状态机。 其主要思想是程序在任意时刻仅可处于几…

《PySpark大数据分析实战》-18.什么是数据分析

&#x1f4cb; 博主简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 热衷于各种主流技术&#xff0c;热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员&#xff08;PCTA&#xff09;、TiDB数据库专家&#xff08;PCTP…

Confluent 与阿里云将携手拓展亚太市场,提供消息流平台服务

10 月 31 日&#xff0c;杭州云栖大会上&#xff0c;阿里云云原生应用平台负责人丁宇宣布&#xff0c;Confluent 成为阿里云技术合作伙伴&#xff0c;合作全新升级&#xff0c;一起拓展和服务亚太市场。 本次合作伙伴签约&#xff0c;阿里云与消息流开创领导者 Confluent 将进一…

掌握函数式组件:迈向现代化前端开发的关键步骤(下)

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

Linux创建macvlan 测试bridge、private和vepa模式

Linux创建macvlan&#xff0c;测试bridge、private和vepa模式 最近在看Docker的网络&#xff0c;看到关于macvlan网络的介绍。查阅了相关资料&#xff0c;记录如下。 参考 1.Linux Macvlan 2.图解几个与Linux网络虚拟化相关的虚拟网卡-VETH/MACVLAN/MACVTAP/IPVLAN 环境 操…

Python遥感影像深度学习指南(1)-使用卷积神经网络(CNN、U-Net)和 FastAI进行简单云层检测

【遥感影像深度学习】系列的第一章,Python遥感影像深度学习的入门课程,介绍如何使用卷积神经网络(CNN)从卫星图像中分割云层 1、数据集 在本项目中,我们将使用 Kaggle 提供的 38-Cloud Segmentation in Satellite Images数据集。 该数据集由裁剪成 384x384 (适用…

十八、本地配置Hive

1、配置MYSQL mysql> alter user rootlocalhost identified by Yang3135989009; Query OK, 0 rows affected (0.00 sec)mysql> grant all on *.* to root%; Query OK, 0 rows affected (0.00 sec)mysql> flush privileges; Query OK, 0 rows affected (0.01 sec)2、…

Web前端 ---- 【Vue】vue路由守卫(全局前置路由守卫、全局后置路由守卫、局部路由path守卫、局部路由component守卫)

目录 前言 全局前置路由守卫 全局后置路由守卫 局部路由守卫之path守卫 局部路由守卫之component守卫 前言 本文介绍Vue2最后的知识点&#xff0c;关于vue的路由守卫。也就是鉴权&#xff0c;不是所有的组件任何人都可以访问到的&#xff0c;需要权限&#xff0c;而根据权限…

深度学习 | 梯度下降算法及其变体

一、最优化与深度学习 1.1、训练误差与泛化误差 1.2、经验风险 1.3、优化中的挑战 1.3.1、局部最小值 1.3.2、 鞍点 经常是由于模型复杂度过高或者训练样本数据过少造成的 —— Overfitting 1.3.3、悬崖 1.3.4、长期依赖问题 二、损失函数 2.1、损失函数的起源 损失函数(loss…