第十五届蓝桥杯JAVA的B组题目详情解析

embedded/2024/11/20 6:23:21/

(第一个填空太简单,就不写了,根本不用代码,直接excel计算)

目录

蓝桥杯第二个填空,类斐波那契循环数

蓝桥杯JAVA.b组第三题 -分布式队列(模拟)

食堂(蓝桥杯D题)

 ​编辑

星际旅行(Floyd佛洛依德)

        其余的有点变态,感觉学了好像也没用,还是算了


蓝桥杯第二个填空,类斐波那契循环数

首先难点就是这个题目需要读懂,当初我就是没读明白,才没写出来,我一般都是写力扣的题,力扣的题更加偏向于方法,或者说是业务上的,而蓝桥杯更偏向那种数学的类型

这个难点是弄懂那个求和符号,我好久没学,都忘了

比如说9999999这个是7位数,然后假如我们写第10位,就是

 public static void main(String[]args) {for(int i=10000000;i>=0;i--){char[] a=(i+"").toCharArray();int sum=0;int[]b=new int[a.length];for(int j=0;j<a.length;j++){b[j]=Integer.valueOf(a[j]+"");sum+=b[j];}while(true) {if (sum == i) {System.out.println(sum);return;} else if (sum > i) {break;}int tmp=sum;sum = 2 * sum - b[0];for (int j = 0; j < a.length - 1; j++) {b[j] = b[j + 1];}//更新最后一个值b[a.length - 1] = tmp;//处理前一个值,进行迭代处理}}

蓝桥杯JAVA.b组第三题 -分布式队列(模拟)

这个代码是我觉得看的最清晰的一个,而且他的想法很简洁,适合我这种菜鸡

这个题难度就是你选择的问题,你假如选择不正好的策略,会麻烦好多。像是我开始想用数组,因为下标不好表示,(开始我也是寻思用集合,但是困在一些问题上,选择自己更擅长的,但是确没想到更麻烦,而且没解出来)

  public static void main(String[]args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();//使用一个类似二维数组List<List<Integer>> nums=new ArrayList<>();for(int i=0;i<n;i++){//这个数组有添加n个队列nums.add(new ArrayList<>());}while (sc.hasNext()) {//通过command判断输入的例子。String command = sc.next();if (command.equals("add")) {int num=sc.nextInt();//假如此时需要添加元素,则需要在第一个集合里面添加元素nums.get(0).add(num);} else if (command.equals("sync")) {//获取到我们需要添加到哪号队列int seq = sc.nextInt();//nums获取到这个队列,假如里面的个数小于一号队列个数if(nums.get(seq).size()<nums.get(0).size()) {//nums的seq队列添加队列0里面的获取的是队列2的长度,队列2的下标永远是没到这个位置,所以需要到2号这个下标nums.get(seq).add(nums.get(0).get(nums.get(seq).size()));}} else {//找到n个队列中到元素个数int min_count = Integer.MAX_VALUE;for (int i = 0; i < n; i++) {//获取到每个元素,然后min代表最后的元素,模拟(很牛逼的思路,第二个)if (nums.get(i).size() < min_count) min_count = nums.get(i).size();}System.out.println(min_count);}}}

食堂(蓝桥杯D题)

 

这个题看着就恶心的模拟,但是假如说暴力穷举肯定也是可以,但是缺点是什么呢?

缺点就是她这个你很容易有想不到的情况,而且这些情况加一起,的顺序性就很恶心

所以相比较之下,还是下面这个方法更好

这道题我相信大部分人的思路肯定是从食堂桌子出发,那么我们需要做的就是分解他条件的思考

首先4个桌子,6个桌子,我们肯定是第一时间,先凑出来6人桌子,2个三人桌肯定是最优先,然后我们考虑的是什么,2+4肯定6个,2+2+2肯定6个,但是假如换个思路,假如已经坐了两个人,我们是不是可以默认这个食堂多了一个四人桌子,如果这么考虑,我们很多情况都可以合并到一起,只需要考虑四人桌子就行,

四人桌子肯定还是优先4人和2个2人,假如这些都完事了,说明什么情况呢,

存在六人桌子,存在4人和3人,但是不存在2人

存在4人桌子,可能存在两个人,可能存在三个人,(有人可能问我们在开始就判断了是否可能出现2个人,结果是一定不会有两个人,但是假如没有六人桌子的情况下,是否有可能出现2个人呢,也是有可能的)

这些情况综合起来只有一句话,就是一个桌子只能坐一个寝室,你2人,3人,4人都好

我只要把最后的桌子都放到一起,然后4人就给一个桌子(不管它是4人还是6人,反正一定能装下)

(这里补充:可能你觉得不靠谱,去试试假如5个人咋整,(5个人的前提是有2个人,2个人要么我存在6人桌子被分开,要不存在六个人的桌子,那样坐不了五个人,所以还是一个桌子一个寝室)

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改public class Main {public static void main(String[]args) {Scanner scan = new Scanner(System.in);int q=scan.nextInt();int[][]a=new int[q][5];//选择的角度应该是从桌子入手,//a[0][0]:两人寝室,[1]三人寝室,[2]四人寝室 [3]四个人桌子[4]六人桌子//更优秀的思想,把六个人的桌子转化为四个人的桌子for(int i=0;i<q;i++){for(int j=0;j<5;j++){a[i][j]=scan.nextInt();}int count=0;//a[0][0]:两人寝室,[1]三人寝室,[2]四人寝室 [3]四个人桌子[4]六人桌子//假如有六人桌子优先分配2个三人while(a[i][4]>0&&a[i][1]>=2){a[i][1]-=2;a[i][4]--;count+=6;}//假如有六人桌子优先分配1个两人,这样,就相当于多了一个四个人的桌子while(a[i][4]>0&&a[i][0]>0){a[i][4]--;a[i][0]--;a[i][3]++;//相当于多了一个四人桌子count+=2;}//假如四人桌子优先分配四个人的while(a[i][3]>0&&a[i][2]>0){a[i][2]--;a[i][3]--;count+=4;}//四人寝室没了,四人桌子优先给2个2人寝室while(a[i][3]>0&&a[i][0]>=2){//2人寝室则剪去2个a[i][0]-=2;a[i][3]--;count+=4;}//到了最后其实就都不是凑整数的情况,换句话说,咋吗都坐不满,6人能转化的,都转化了,转化不了的,也同化成4个人//因为假如你想5个人是3+2,相当于四人寝室住了3个人,换句话,最后四人桌子还是六人桌子已经没有区别了int num=a[i][4]+a[i][3];//以下的情况都是满足不了的while(num>0&&a[i][2]>0){num--;a[i][2]--;count+=4;}while(num>0&&a[i][1]>0){num--;a[i][1]--;count+=3;}while(num>0&&a[i][0]>0){num--;a[i][0]--;count+=2;}System.out.println(count);}scan.close();}}

最优分组(数学题)

​​​​​​​

星际旅行(Floyd佛洛依德)

static int n,m,q;static int[][] con;public static void main(String[] args) {Scanner zh=new Scanner(System.in);n=zh.nextInt();m=zh.nextInt();q=zh.nextInt();con=new int[n+1][n+1];//我们选择从[1-n]闭区间,不考虑0
//处理边界值比如0x之类的for(int i=1;i<=n;i++)Arrays.fill(con[i], 3010);for(int i=1;i<=n;i++)con[i][i]=0;for(int i=0;i<m;i++) {int a=zh.nextInt();int b=zh.nextInt();con[a][b]=1;con[b][a]=1;}//算法核心,核心问题也在这里k在最外面和k在循环的最里面有什么区别for(int k=1;k<=n;k++) {for(int i=1;i<=n;i++) {for(int j=1;j<=n;j++) {
//这个的核心是类似于动态规划从con[i][j],con[i][k]+[k][j],从i到j,需要i通过k到j
//相当于算从i到j位置的最短路径,con[i][j]=Math.min(con[i][j], con[i][k]+con[k][j]);}}}int ans=0;for(int i=0;i<q;i++) {int x=zh.nextInt();int y=zh.nextInt();int count=0;
//我们从x点出发,到达j点花费步骤假如小于y就说明可以到达,count++;for(int j=1;j<=n;j++)if(con[x][j]<=y)count++;//System.out.println(count);ans+=count;}System.out.printf("%.2f", (double)ans/q);}

        其余的有点变态,感觉学了好像也没用,还是算了


http://www.ppmy.cn/embedded/138989.html

相关文章

PNG图片隐写之IDAT

IDAT 结构 在PNG文件中&#xff0c;每个块&#xff08;包括IDAT块&#xff09;的结构是固定的&#xff0c;CRC校验码总是位于每个块的末尾。具体来说&#xff0c;每个块的结构如下&#xff1a; 长度&#xff08;4字节&#xff09;&#xff1a;表示数据部分的长度。 类型&…

如何通过统计来反映工业新产业发展情况

工业战略性新兴产业对经济全局和长远发展具有重大引领带动作用&#xff0c;如何通过统计来反映工业新产业发展情况&#xff1f; 战略性新兴产业是以重大技术突破和重大发展需求为基础&#xff0c;对经济社会全局和长远发展具有重大引领带动作用&#xff0c;知识技术密集、物质…

在openi平台 基于华为顶级深度计算平台 openmind 动手实践

大家可能一直疑问&#xff0c;到底大模型在哪里有用。 本人从事的大模型有几个方向的业务。 基于生成式语言模型的海事航行警告结构化解析。 基于生成式语言模型的航空航行警告结构化解析。 基于生成式生物序列&#xff08;蛋白质、有机物、rna、dna、mrna&#xff09;的多模态…

国产RestApi工具Apifox使用介绍

常见RestApi工具介绍 常见的接口工具有Postman、Swagger等&#xff0c;当然还有其他很多种&#xff0c;就不列举了&#xff0c;在遇到Apifox之前&#xff0c;我一直都使用的Postman&#xff0c;但是Postman有个弊端&#xff0c;就是网络问题&#xff0c;还有就是免费有限制&…

HBase 开发:使用Java操作HBase

1、实战简介 HBase和Hadoop一样&#xff0c;都是用Java进行开发的&#xff0c;本次实训我们就来学习如何使用Java编写代码来操作HBase数据库。 实验环境&#xff1a; hadoop-2.7 JDK8.0 HBase2.1.1 2、任务 1、第1关&#xff1a;创建表 package step1; import java.io.IOE…

JavaScript 高级—求数组的最大值与最小值

JavaScript 数组操作&#xff1a;求数组的最大值与最小值 在编程中&#xff0c;处理数组是一个常见的任务。JavaScript 提供了一些内建的方法和技巧&#xff0c;可以方便地找到数组中的最大值和最小值。今天&#xff0c;我们就来详细探讨一下如何使用 JavaScript 来实现这一功…

读懂top后显示内容

第一行&#xff1a;系统信息 top - 06:33:12 up 42 min, 1 user, load average: 0.04, 0.02, 0.00 06:33:12&#xff1a;当前时间。up 42 min&#xff1a;系统已经启动了 42 分钟。1 user&#xff1a;当前有 1 个用户登录。load average: 0.04, 0.02, 0.00&#xff1a;这三个…

Flutter 生成二维码

在这篇博客中&#xff0c;我们将学习如何使用 Flutter 创建二维码&#xff0c;并实现一些常见的自定义选项。通过使用 qr_flutter插件&#xff0c;我们可以轻松地生成基本二维码&#xff0c;甚至可以将图片嵌入二维码中。最终的效果将包括两个二维码&#xff1a;一个是普通二维…