大理网站建设,阿里巴巴做网站联系人,电子商务网站的设计,有网站如何做直播目录 前言#xff1a;试题 A: 报数游戏试题 B: 类斐波那契循环数试题C:分布式队列 前言#xff1a; 没参加这次蓝桥杯算法赛#xff0c;十四届蓝桥杯被狂虐#xff0c;对算法又爱又恨#xff0c;爱我会做的题#xff0c;痛恨我连题都读不懂的题#x1f62d;,十四届填空只… 目录 前言试题 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排成数列是【12345】。 这个数列的其它部分分别为从当前数列的最后一位起前n项的和。例如数字12345共5位排成数列【12345(?)…】此时数列的第6个数就是从当前数列的最后一位起前5项的和即1234515【1234515】第7个数就是从当前数列的最后一位起前5项的和即23451529【123451529】… 如果这个数列中包含这个数字本身那么这个数就是类斐波那契循环数。 求从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停不下来