2024第十五届蓝桥杯 JAVA B组

目录

  • 前言:
  • 试题 A: 报数游戏
  • 试题 B: 类斐波那契循环数
  • 试题C:分布式队列

前言:

没参加这次蓝桥杯算法赛,十四届蓝桥杯被狂虐,对算法又爱又恨,爱我会做的题,痛恨我连题都读不懂的题😭,十四届填空只做对一个,今天闲的蛋疼想看看这次比赛能做对几个。

暂时没找到题目,这是网上找的简略版,看了看就知道蓝桥杯前几道题就喜欢考数学思维和十四届一样

试题 A: 报数游戏

在这里插入图片描述

(简洁版) 从小到大排列是20或24倍数的正整数,前10个数依次是:”20 24 40 48 60 72 80 96 100 120“,求第202420242024个数是多少?(填空题)

解题思路:

最开始想的是求求它俩的最小公倍数是120发现没啥用,然后再发现24比20多4,也就是24向前叠加5次就整整多出来一个20,然后再在纸上画画发现了每10次一循环:

在这里插入图片描述

可以看出第10个数是24 * 5,第20个数是24 * 10,那么202420242024可以分成202420242020 + 4,最后发现偶数4也是24结尾,那么答案就是202420242024 / 2 * 24
在这里插入图片描述


试题 B: 类斐波那契循环数

在这里插入图片描述

(个人理解:) 将一个n位的数字按一定的规则排成一个数列。
规则:
这个数列的起始部分分别为该数字每一位上的数。例如:数字(12345)排成数列是【1,2,3,4,5】。
这个数列的其它部分分别为从当前数列的最后一位起,前n项的和。例如数字(12345,共5位)排成数列【1,2,3,4,5,(?),…】,此时数列的第6个数就是从当前数列的最后一位起前5项的和,即(1+2+3+4+5=15)【1,2,3,4,5,15】;第7个数就是从当前数列的最后一位起前5项的和,即(2+3+4+5+15=29)【1,2,3,4,5,15,29】;…
如果这个数列中包含这个数字本身,那么这个数就是类斐波那契循环数。
求从0~10^7范围中最大的类斐波那契循环数。(填空题)

解题思路:

仔细做了做例子发现:
在这里插入图片描述
发现有点像滑动窗口,求新数后窗口移动一下,所以想着将整个过程放在一个数组里,但是这样一整每次数组的长度都是不定的,不好定义数组的长度,且求到新数后,数组前面的区域就没用了,所以就想着能否用一个定长数组来做滑动窗口,且所有区域都用的上

分析一下上面例子求出新数15后第一个数1就对求下一个数29来说没用了,为什么不把15放在1的位置,以此类推29放在2的位置

在这里插入图片描述
这样就好整了,数组大小就等于数字的位数,还需要一个K指针在整个数组中循环移动用%Length就解决了

说实话这个灵感来源于我嵌入式对页面切换的处理…

最后看是怎么停止了,题目说了这个数列中包含这个数本身那么这个数就是类斐波那契循环数,因为每次求得得新数都是递增的,所以如果新数都大于原始数的话,那么说明这个数不是类斐波那契循环数

既然求类斐波那契循环数的整个逻辑模式都搞明白了,剩下就是用代码实现上述的功能需求了:

import java.util.*;public class Main {static int END = 10000000;public static void main(String[] args) {int MaxNumber = 0;for(int i = 1; i <= END; i ++) {  // 由1开始int Length = GetNumnberLength(i);int Array[] = new int[Length];NumbertoArray(Array, i);int k = 0;while(true) {Array[k] = ListNumberSum(Array);if(Array[k] == i || Array[k] > i) break;  // 要么是类斐波那契循环数要么不是k = (k + 1) % Length;}if(Array[k] == i) {  // 是的话更新MaxNumberif(MaxNumber <= i) {MaxNumber = i;}}}System.out.println(MaxNumber);}public static int GetNumnberLength(int number) {int len = 0;while(number > 0) {len ++;number = number / 10;}return len;}public static void NumbertoArray(int array[], int number) {for(int i = array.length - 1; i >= 0; i --) {array[i] = number % 10;number = number / 10;}}public static int ListNumberSum(int array[]) {int sum = 0;for(int i = 0; i < array.length; i ++) sum = sum + array[i];return sum;}
}

其中while循环应该也循环不了几百次,整个时间复杂度应该等于10^7 * while循环次数,超过不了10^9复杂度,计算机一两秒就算出来了。

答案:在这里插入图片描述


以下试题全靠自己想法去做,可能有漏洞:

试题C:分布式队列

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
解题思路:

先做例题,可以看出每个结点都可以当作一个独立的数组,在执行操作命令的时候对对应数组进行操作,add就是对主结点做添加操作,sync就是对对应副结点做操作,query就是输出情况

那么好怎么将具体的例子解法抽象成一般问题的解决逻辑呢,并且这个逻辑能较好用编程去实现?

首先分析到这个题有点像木桶的短板效应,即输出只需要关注最少元素的那个副结点即可,且主结点内装具体什么元素好像都不重要,重要的是装了几个元素

这样以来变成就简化成了一维数组,每个数组下标对应相应结点,数组对应值为同步的数的数量,只需关注最小的那个结点即可

代码:

import java.util.*;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int Number = sc.nextInt();  // 输入String Temp = sc.nextLine();  // 吃空格int Array[] = new int [Number];while(sc.hasNext()){String Command = sc.nextLine();if(Command.charAt(0) == 'a') { Array[0] ++;  // add命令  }else if(Command.charAt(0) == 'q') {System.out.println(GetArrayMinNumber(Array));}else {String Split[] = Command.split("\\s+");int Index =  Integer.parseInt(Split[1]);if(Array[Index] < Array[0]) Array[Index] ++;  // 主节点还有多的元素才能同步}}}public static int GetArrayMinNumber(int array[]) {int MinOne = Integer.MAX_VALUE;for(int i = 0; i < array.length; i ++) {if(MinOne >= array[i]) MinOne = array[i];}return MinOne;}
}

注意:主节点没有多余的元素就不能同步给副结点了

例如:
2
sync 1
sync 1
add 11
add 22
query
输出为0而不是2

另外sc.hasNext是读到文件末尾会停,用while true停不下来

在这里插入图片描述


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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

龙蜥社区「人人都可以参与开源」——开源之路心得体会

在龙蜥社区的开源活动中&#xff0c;我深刻体会到了开源精神的伟大与力量。作为一个新手&#xff0c;一开始我对于如何参与开源活动感到有些迷茫&#xff0c;但通过龙蜥社区的引导和帮助&#xff0c;我找到了自己的方向&#xff0c;走上了开源之路。 龙蜥社区的开源活动是真正…

docker run启动一个开发备忘清单速查表 —— 筑梦之路

docker run -itd --name reference -p 3000:3000 registry.cn-beijing.aliyuncs.com/deanmr/reference:latest包含&#xff1a;运维&#xff0c;前端&#xff0c;后端&#xff0c;工具&#xff0c;命令&#xff0c;数据库 部分截图展示&#xff1a;

每天五分钟深度学习:逻辑回归算法的损失函数和代价函数是什么?

本文重点 前面已经学习了逻辑回归的假设函数,训练出模型的关键就是学习出参数w和b,要想学习出这两个参数,此时需要最小化逻辑回归的代价函数才可以训练出w和b。那么本节课我们将学习逻辑回归算法的代价函数是什么? 为什么不能平方差损失函数 线性回归的代价函数我们使用…

【嵌入式】交叉编译指南:将开源软件带到嵌入式世界

&#x1f9d1; 作者简介&#xff1a;阿里巴巴嵌入式技术专家&#xff0c;深耕嵌入式人工智能领域&#xff0c;具备多年的嵌入式硬件产品研发管理经验。 &#x1f4d2; 博客介绍&#xff1a;分享嵌入式开发领域的相关知识、经验、思考和感悟,欢迎关注。提供嵌入式方向的学习指导…

公众号文章的制作方法和步骤分享,纯干货!

无论是个人还是企业&#xff0c;都需要通过公众号来传递自己的声音和价值。如何制作一篇高质量的公众号文章呢&#xff1f;本文伯乐网络传媒将详细介绍公众号文章的制作方法和步骤。 一、文章类型概述 1. 图文教程&#xff1a;以图文结合的方式&#xff0c;向读者传授知识和技…

P1712 [NOI2016] 区间(线段树 + 贪心 + 双指针)

题目描述 在数轴上有 n 个闭区间从 1 至 n 编号&#xff0c;第 i 个闭区间为 [li​,ri​] 。 现在要从中选出 m 个区间&#xff0c;使得这 m 个区间共同包含至少一个位置。换句话说&#xff0c;就是使得存在一个 x &#xff0c;使得对于每一个被选中的区间 [li​,ri​]&#…

DFS专题:力扣岛屿问题(持续更新)

DFS专题&#xff1a;力扣岛屿问题 一、岛屿数量 题目链接: 200.岛屿数量 题目描述 代码思路 使用深度优先搜索&#xff0c;对每一个网格点进行判断&#xff0c;如果为未搜索过的’1’&#xff0c;则使岛屿数加一&#xff0c;并将与其相连的‘1’都进行标记&#xff0c;确保…

企业为什么要做等级保护

一、等级保护是我国关于网络安全的基本政策 《国家信息化领导小组关于加强信息安全保障工作的意见》&#xff08;中办发[2003]27 号&#xff0c;以下简称“27 号文件”&#xff09;明确要求我国信息安全保障工作实行等级保护制度,提出“抓紧建立信息安全等级保护制度&#xff…

区块链开发者大会圆满结束:记Hack.Summit() 2024的合作机构群像

Hack.Summit() 2024 区块链开发者大会于4月9日至10日在香港数码港隆重举行。经过两天的精彩交流与深入探讨&#xff0c;本次大会圆满落下帷幕&#xff0c;不仅汇聚了全球区块链领域的顶尖人才和机构&#xff0c;还展示了最新的技术成果和创新应用&#xff0c;为区块链行业的发展…

Ubuntu 23.10.1 nginx源码安装

注&#xff1a;以下所有命令均在root管理员模式下&#xff0c;若不是&#xff0c;请在所有命令前加sudo 1、安装依赖库 1.1、安装gcc g的依赖库 apt-get install build-essential apt-get install libtool1.2、安装pcre依赖库 apt-get update apt-get install libpcre3 lib…

接口自动化框架设计之参数传递(超详细)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片 &#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 在我们设计自动化测试框架的时候&#xff0c;我们会经常将测试数据保存在外部的文件&#xff08…

C#值传递和引用传递,ref和out关键字,装箱和拆箱

C#值传递和引用传递 1.值传递和引用传递 值传递&#xff1a;值传递时&#xff0c;系统首先为被调用方法的形参分配内存空间&#xff0c;并将实参的值按位置一一对应复制给形参&#xff0c;被调用方法中形参得任何改变都不会影响到相应的实参。 引用传递时&#xff1a;系统不是…