【蓝桥杯 第十五届模拟赛 Java B组】训练题(A - I)

 目录

A、求全是字母的最小十六进制数

B、Excel表格组合

C、求满足条件的日期

D、 取数字 - 二分

(1)暴力

(2)二分

E、最大连通块 - bfs

F、哪一天?

G、信号覆盖 - bfs

(1)bfs(60%)

(2)暴力

H、清理水域 - 暴力(弱智版) 可以差分

I、滑行 - dfs + dp

(1)dfs(30%)

(2)dp+dfs(100%) 


A、求全是字母的最小十六进制数

请找到一个大于2022的最小数,该数转换为十六进制后,所有数位(不含前导0)都为字母(A到F),请计算出这个数的十进制。

思路:

最小的全是字母的数肯定是全是a的, 从2023开始逐个循环转十六进制判断即可

答案:2730

import java.util.*;public class abc {public static void main(String[] args){Scanner sc=new Scanner(System.in);int n=2023;while(true){String s=Integer.toHexString(n);if(ck(s)==true) break;n++;}System.out.print(n);}public static boolean ck(String s){for(char c:s.toCharArray()){if(c<'a'||c>'f') return false;}return true;}
}

B、Excel表格组合

在Excel中,列的名称使用英文字母组合,前26列用一个字母,依次为A到Z,接下来26*26列使用两个字母的组合,依次为AA到ZZ,求第2022列的名称是什么?

思路:

已知单个字母和双字母组合共26+26*26=702,而三个字母组合有26*26*26=17576,因此第2022列名称为三个字母的组合

三重暴力算2022列的值,答案为:BYT

import java.util.*;public class abc {public static void main(String[] args){Scanner sc=new Scanner(System.in);int beg=702;for(int i=0;i<26;i++)for(int j=0;j<26;j++)for(int k=0;k<26;k++){beg++;if(beg==2022){char a=(char)('A'+i),b=(char)('A'+j),c=(char)('A'+k);System.out.print(a+" "+b+" "+c);break;}}}
}

C、求满足条件的日期

对一个日期,我们可以计算出年份的各个数位上的数字之和,也可以分别计算月和日的各位数字之和。请问从1900年1月1日至9999年12月31日,总共有多少天,年份的数位数字之和=月的数位之和+日的数位之和。

例如:2022年11月13日满足要求,因为6=2+4

请求出满足条件的日期总数量

思路:

数组记录1——12月每一个月的天数,注意闰年2月为29天,然后三重暴力循环计算即可

答案:70910

import java.util.*;public class abc {public static void main(String[] args){Scanner sc=new Scanner(System.in);int res=0;int[] a= {0,31,28,31,30,31,30,31,31,30,31,30,31};for(int i=1900;i<=9999;i++){String y=String.valueOf(i);for(int j=1;j<=12;j++){if(i%400==0||(i%4==0&&i%100!=0)) a[2]=29;else a[2]=28;String m=String.valueOf(j);for(int k=1;k<=a[j];k++){String d=String.valueOf(k);if(ck(y,m,d)) res++;}}}System.out.print(res);}public static boolean ck(String y,String m,String d){int yy=0,mm_dd=0;for(char c:y.toCharArray()) yy+=c-'0';for(char c:m.toCharArray()) mm_dd+=c-'0';for(char c:d.toCharArray()) mm_dd+=c-'0';if(yy==mm_dd) return true;return false;}

D、 取数字 - 二分

小蓝有30个数,分别为:99,22,51,63,72,61,20,88,40,21,63,30,11,18,99,12,93,16,7,53,64,9,28,84,34,96,52,82,51,77

小蓝可以从这些数中取出两个序号不同的数,共30*29/2=435种取法

请问这435种取法中,有多少种取法取出的两个数乘积大于等于2022?

思路:

直接暴力枚举,二分优化,答案是:189

(1)暴力

public class Main4 {public static void main(String[] args) {int res=0;int[] a={99, 22, 51, 63, 72, 61, 20, 88, 40, 21, 63, 30, 11, 18, 99, 12, 93, 16, 7, 53, 64, 9, 28, 84, 34, 96, 52, 82, 51, 77};for(int i=0;i<30;i++)for(int j=i+1;j<30;j++ ) if(a[i]*a[j]>=2022) res++;System.out.println(res);}
}

(2)二分

import java.util.*;public class abc {public static void main(String[] args){Scanner sc=new Scanner(System.in);int res=0;int[] a= {99, 22, 51, 63, 72, 61, 20, 88, 40, 21, 63, 30, 11, 18, 99, 12, 93, 16, 7, 53, 64, 9, 28, 84, 34, 96, 52, 82, 51, 77};Arrays.sort(a);for(int i=0;i<a.length-1;i++)  //最后一个数没有后续配对的{int target=(int)Math.ceil(2022*1.0/a[i]);int idx=binary(a,target,i+1,a.length-1); //在【i+1,n-1】区间找防止重复if(2022/a[i]>a[idx]) continue;res+=a.length-idx;}System.out.print(res);}public static int binary(int[] a,int target,int l,int r){while(l<r){int mid=l+r>>1;if(a[mid]>=target) r=mid;else l=mid+1;}return r;}
}

E、最大连通块 - bfs

小蓝有一个 30 行 60 列的数字矩阵,矩阵中的每个数都是 0 或 1 。  

110010000011111110101001001001101010111011011011101001111110
010000000001010001101100000010010110001111100010101100011110
001011101000100011111111111010000010010101010111001000010100
101100001101011101101011011001000110111111010000000110110000
010101100100010000111000100111100110001110111101010011001011
010011011010011110111101111001001001010111110001101000100011
101001011000110100001101011000000110110110100100110111101011
101111000000101000111001100010110000100110001001000101011001
001110111010001011110000001111100001010101001110011010101110
001010101000110001011111001010111111100110000011011111101010
011111100011001110100101001011110011000101011000100111001011
011010001101011110011011111010111110010100101000110111010110
001110000111100100101110001011101010001100010111110111011011
111100001000001100010110101100111001001111100100110000001101
001110010000000111011110000011000010101000111000000110101101
100100011101011111001101001010011111110010111101000010000111
110010100110101100001101111101010011000110101100000110001010
110101101100001110000100010001001010100010110100100001000011
100100000100001101010101001101000101101000000101111110001010
101101011010101000111110110000110100000010011111111100110010
101111000100000100011000010001011111001010010001010110001010
001010001110101010000100010011101001010101101101010111100101
001111110000101100010111111100000100101010000001011101100001
101011110010000010010110000100001010011111100011011000110010
011110010100011101100101111101000001011100001011010001110011
000101000101000010010010110111000010101111001101100110011100
100011100110011111000110011001111100001110110111001001000111
111011000110001000110111011001011110010010010110101000011111
011110011110110110011011001011010000100100101010110000010011
010011110011100101010101111010001001001111101111101110011101

如果从一个标为 1 的位置可以通过上下左右走到另一个标为 1 的位置,则称两个位置连通。与某一个标为 1 的位置连通的所有位置(包括自己)组成一个连通分块。  

请问矩阵中最大的连通分块有多大?

思路:

答案是148

bfs进入为1的点,上下左右扩展计数,最后求每一次bfs最大值即可,模板提 

import java.util.*;public class abc {static int n=30,m=60;static int[][] g=new int[n][m];static int[][] st=new int[n][m];static int[] dx={0,0,1,-1},dy= {1,-1,0,0};public static void main(String[] args){Scanner sc=new Scanner(System.in);String t;for(int i=0;i<n;i++){String s=sc.next();for(int j=0;j<m;j++) g[i][j]=s.charAt(j)-'0';}int res=0;for(int i=0;i<n;i++){for(int j=0;j<m;j++){if(g[i][j]==1&&st[i][j]==0)res=Math.max(res, bfs(i,j));}}System.out.print(res);}public static int bfs(int x,int y){int cnt=1;st[x][y]=1;Queue<PII> q=new LinkedList<>();q.offer(new PII(x,y));while(!q.isEmpty()){PII t=q.poll();int xx=t.x,yy=t.y;for(int i=0;i<4;i++){int nx=dx[i]+xx,ny=dy[i]+yy;if(nx>=0&&nx<n&&ny>=0&&ny<m&&st[nx][ny]==0&&g[nx][ny]==1){st[nx][ny]=1;q.offer(new PII(nx,ny));cnt++;}}}return cnt;}}
class PII
{int x,y;PII(int x,int y){this.x=x;this.y=y;}
}

F、哪一天?

1<=n<=10^6

思路:

注意特判整除7的情况,不能输出0,应该输出7 

import java.util.*;public class abc {public static void main(String[] args){Scanner sc=new Scanner(System.in);int w=sc.nextInt(),n=sc.nextInt();int res=(w+n%7)%7;System.out.print(res==0? 7:res);}
}

G、信号覆盖 - bfs

问题描述

        小蓝负责一块区域的信号塔安装,整块区域是一个长方形区域,建立坐标轴后,西南角坐标为 (0, 0), 东南角坐标为 (W, 0), 西北角坐标为 (0, H), 东北角坐标为 (W, H)。其中 W, H 都是整数。
        他在 n 个位置设置了信号塔,每个信号塔可以覆盖以自己为圆心,半径为 R 的圆形(包括边缘)。
        为了对信号覆盖的情况进行检查,小蓝打算在区域内的所有横纵坐标为整数的点进行测试,检查信号状态。其中横坐标范围为 0 到 W,纵坐标范围为 0 到 H,总共测试 (W+1) * (H+1) 个点。
        给定信号塔的位置,请问这 (W+1)*(H+1) 个点中有多少个点被信号覆盖。

输入格式

        输入第一行包含四个整数 W, H, n, R,相邻整数之间使用一个空格分隔。
        接下来 n 行,每行包含两个整数 x, y,表示一个信号塔的坐标。信号塔可能重合,表示两个信号发射器装在了同一个位置。

输出格式

        输出一行包含一个整数,表示答案。

样例输入

10 10 2 5
0 0
7 0

样例输出

57

评测用例规模与约定

1 <= W, H <= 100

1 <= n <= 100

1 <= R <= 100

0 <= x <= W

0 <= y <= H

(1)bfs(60%)

can you tell me why? 

思路:

st数组标记被覆盖的坐标点,对于每个信号塔进行bfs,对每个点上下左右扩展

若【在合法范围内】且【未标记】且【该点到信号塔的距离<=r】,则入队标记 ,并统计覆盖点范围

import java.util.*;public class abc {static int[][] st;static int res=0,r,h,w,n;static int[] dx={0,0,1,-1},dy= {1,-1,0,0};public static void main(String[] args){Scanner sc=new Scanner(System.in);w=sc.nextInt();h=sc.nextInt();n=sc.nextInt();r=sc.nextInt();st=new int[w+1][h+1];for(int i=0;i<n;i++){int x=sc.nextInt(),y=sc.nextInt();bfs(x,y);}for(int i=0;i<=w;i++)for(int j=0;j<=h;j++) if(st[i][j]==1) res++;System.out.print(res);}public static void bfs(int x,int y){st[x][y]=1;Queue<PII> q=new LinkedList<>();q.offer(new PII(x,y));while(!q.isEmpty()){PII t=q.poll();int xx=t.x,yy=t.y;for(int i=0;i<4;i++){int nx=dx[i]+xx,ny=dy[i]+yy;if(nx>=0&&nx<=w&&ny>=0&&ny<=h&&st[nx][ny]==0&&ck(x,y,nx,ny)){q.offer(new PII(nx,ny));st[nx][ny]=1;}}}}public static boolean ck(int x,int y,int nx,int ny){int dis=(x-nx)*(x-nx)+(y-ny)*(y-ny);if(dis<=r*r) return true;return false;}
}
class PII
{int x,y;PII(int x,int y){this.x=x;this.y=y;}
}

 (2)暴力

import java.util.*;public class Main {public static void main(String[] args) {Scanner scan = new Scanner(System.in);int w = scan.nextInt(), h = scan.nextInt(), n = scan.nextInt(), r = scan.nextInt();int[][] arr = new int[n][2];for (int i = 0; i < n; i++) {arr[i][0] = scan.nextInt();arr[i][1] = scan.nextInt();}int count = 0;for (int i = 0; i <= w; i++) {for (int j = 0; j <= h; j++) {if (check(arr, n, r, i, j)) {count++;}}}System.out.println(count);}public static boolean check(int[][] arr, int n, int r, int x, int y) {for (int i = 0; i < n; i++) {int x0 = x - arr[i][0];int y0 = y - arr[i][1];if (x0 * x0 + y0 * y0 <= r * r) return true;}return false;}
}

H、清理水域 - 暴力(弱智版) 可以差分

import java.util.*;public class abc {public static void main(String[] args){Scanner sc=new Scanner(System.in);int n=sc.nextInt(),m=sc.nextInt(),t=sc.nextInt();int[][] g=new int[n+1][m+1];int res=0;while(t-->0){int r1=sc.nextInt(),c1=sc.nextInt(),r2=sc.nextInt(),c2=sc.nextInt();for(int i=r1;i<=r2;i++)for(int j=c1;j<=c2;j++) g[i][j]=1;}for(int i=1;i<=n;i++)for(int j=1;j<=m;j++) if(g[i][j]==0) res++;System.out.print(res);}}

I、滑行 - dfs + dp

输入格式
  输入第一行包含两个整数 n, m,用一个空格分隔。
  接下来 n 行,每行包含 m 个整数,相邻整数之间用一个空格分隔,依次表示每个位置的高度。
输出格式
  输出一行包含一个整数,表示答案。


样例输入
4 5
1 4 6 3 1
11 8 7 3 1
9 4 5 2 1
1 3 2 2 1
样例输出
7


样例说明
  滑行的位置一次为 (2, 1), (2, 2), (2, 3), (3, 3), (3, 2), (4, 2), (4, 3)。

评测用例规模与约定
  对于 30% 评测用例,1 <= n <= 20,1 <= m <= 20,0 <= 高度 <= 100。
  对于所有评测用例,1 <= n <= 100,1 <= m <= 100,0 <= 高度 <= 10000。

(1)dfs(30%)

import java.util.*;
import java.math.*;public class Main {static int res=0;static int[] dx={0,0,1,-1},dy={1,-1,0,0};public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n=sc.nextInt(),m=sc.nextInt();int[][] g=new int[n][m];for(int i=0;i<n;i++)for(int j=0;j<m;j++) g[i][j]=sc.nextInt();for(int i=0;i<n;i++)for(int j=0;j<m;j++){dfs(i,j,g,1,n,m);}System.out.print(res);sc.close();}public static int dfs(int x,int y,int[][] g,int cnt,int n,int m){for(int i=0;i<4;i++){int nx=x+dx[i],ny=y+dy[i];if(nx>=0&&nx<n&&ny>=0&&ny<m&&g[nx][ny]<g[x][y]){cnt++;res=Math.max(res,cnt);dfs(nx,ny,g,cnt,n,m);cnt--;}}return cnt;}
}

(2)dp+dfs(100%) 

思路

定义d[i][j]为从(i,j)出发能滑行的最长距离,则求出max每个d[i][j]即可

import java.util.*;
import java.math.*;public class Main {static int n,m,res=0;static int[][] g,d;static int[] dx={0,0,1,-1},dy={1,-1,0,0};public static void main(String[] args) {Scanner sc = new Scanner(System.in);n=sc.nextInt();m=sc.nextInt();g=new int[n][m];d=new int[n][m];for(int i=0;i<n;i++)for(int j=0;j<m;j++) {g[i][j]=sc.nextInt();}for(int i=0;i<n;i++)for(int j=0;j<m;j++)res=Math.max(res,dfs(i,j));System.out.print(res);sc.close();}public static int dfs(int x,int y){if(d[x][y]!=0) return d[x][y]; //如果这个点被访问过,返回从这个点能滑行的最大距离d[x][y]=1;for(int i=0;i<4;i++){int nx=x+dx[i],ny=y+dy[i];if(nx>=0&&nx<n&&ny>=0&&ny<m&&g[nx][ny]<g[x][y]){d[x][y]=Math.max(d[x][y],dfs(nx,ny)+1);}}return d[x][y];}
}

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

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

相关文章

(C语言)输入一个序列,判断是否为奇偶交叉数

#include <stdio.h> #include <string.h> int main() {char str[50];gets(str);int len,tmp 1;len strlen(str); //获取字符串长度 for (int i 0;i < len-1 ;i ){if((str[i] % 2 0 ) && (str[i1] % 2 ! 0)) //判断先偶数后奇数序列 tmp ;else if((s…

【Azure 架构师学习笔记】-Azure Storage Account(6)- File Layer

本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Storage Account】系列。 接上文 【Azure 架构师学习笔记】-Azure Storage Account&#xff08;5&#xff09;- Data Lake layers 前言 上一文介绍了存储帐户的概述&#xff0c;还有container的一些配置&#xff0c;在…

(.htaccess文件特性)[MRCTF2020]你传你呢 1

题目环境&#xff1a; 不难看出是一道文件上传漏洞 上传一句话木马文件burpsuite进行抓包<?php eval($_POST[shell]);?> 命名为PHP文件格式 Repeater进行重放 尝试了其它后缀进行绕过都没有成功 通过 application/x-php内容类型&#xff0c;可以看出被识别出是PHP文件&…

聊一聊前端面临的安全威胁与解决对策

前端是用户在使用您的网站或Web应用程序时首先体验到的东西。如果您的Web应用程序的前端受到侵害&#xff0c;它可能会影响整个布局&#xff0c;并造成糟糕的用户体验&#xff0c;可能难以恢复。集成前端安全变得越来越重要&#xff0c;本文将指导您通过可以应用于保护您的Web应…

什么是圆锥的准线?

定曲线C叫做锥面的准线&#xff0c;构成曲面的每一条直线叫做母线。

android 数独小游戏 经典数独·休闲益智

一款经典数独训练app 标题资源下载 &#xff08;0积分&#xff09;https://download.csdn.net/download/qq_38355313/88544810 首页页面&#xff1a; 1.包含有简单、普通、困难、大师四种难度的数独挑战供选择&#xff1b; 记录页面&#xff1a; 1.记录用户训练过的数独信息&…

三江城115m²3室2厅2卫,现代简约不单是居所更是对生活的向往。福州中宅装饰,福州装修

【前言】 简洁有力&#xff0c;静默无声。 以简约精致的方式&#xff0c;展现现代都市生活&#xff1b; 经典不因潮流褪色&#xff0c;不为悦人只为悦己。 项目信息 项目名称 | 三江城 设计地址 | 福建福州 项目面积 | 115㎡ 项目户型 | 3室2厅 设计风格 | 现代简约 全…

基于单片机的电源切换控制器设计(论文+源码)

1.系统设计 在基于单片机的电源切换控制器设计中&#xff0c;系统功能设计如下&#xff1a; &#xff08;1&#xff09;实现电源的电压检测&#xff1b; &#xff08;2&#xff09;如果电压太高&#xff0c;通过蜂鸣器进行报警提示&#xff0c;继电器进行切换&#xff0c;使…

Git本地项目提交到Gitee的操作流程

一、Gitee创建一个仓库 第一步&#xff1a; 第二步&#xff1a; 第三步&#xff1a; 第四步&#xff1a;复制该仓库地址&#xff08;https://gitee.com/yassels/test_1115.git&#xff09;&#xff0c;留待后续使用 二、操作本地文件上传到Gitee 第一步&#xff1a; 第二步…

怎么去掉邮件内容中的回车符

上图是Outlook 截图&#xff0c;可见1指向的总有回车符&#xff1b; 故障原因&#xff1a; 不小心误按了箭头4这个选项&#xff1b; 解决方法&#xff1a; 点击2箭头确保tab展开&#xff1b; 点击3以找到箭头4. 取消勾选或者多次点击&#xff0c;即可解决。

相机突然断电,保存的DAT视频文件如何修复

3-7 本文主要解决因相机突然断电导致拍摄的视频文件损坏的问题。 在平常使用相机拍摄视频&#xff0c;比如用单反相机、无人机拍摄视频的时候&#xff0c;如果电池突然断电&#xff0c;或者突然炸机了&#xff0c;就非常有可能会得到一个损坏的视频文件&#xff0c;比如会产生…

计算机毕业设计选题推荐-幼儿园管理微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…

SDL音视频渲染

01-SDL简介 官网&#xff1a;https://www.libsdl.org/ 文档&#xff1a;http://wiki.libsdl.org/Introduction SDL&#xff08;Simple DirectMedia Layer&#xff09;是一套开放源代码的跨平台多媒体开发库&#xff0c;使用C语言写成。SDL提供了数种控制图像、声音、输出入的函…

6块钱改变世界,网易和拼多多踏入同一条河流?

年底将至&#xff0c;各种颁奖盛典星光熠熠。如果要给今年深蹲反弹中的互联网大厂颁奖&#xff0c;2023表现最突出的可能是师出同门的兄弟网易和拼多多。 从市场表现来看&#xff0c;两家企业录得今年互联网中概股最高涨幅&#xff0c;被称为“中概股之光”&#xff1a;2023年…

Kubernetes学习-概念2

参考&#xff1a;关于 cgroup v2 | Kubernetes 关于 cgroup v2 在 Linux 上&#xff0c;控制组约束分配给进程的资源。 kubelet 和底层容器运行时都需要对接 cgroup 来强制执行为 Pod 和容器管理资源&#xff0c; 这包括为容器化工作负载配置 CPU/内存请求和限制。 Linux 中…

当攻防演练已成常态,企业应该相信西医还是老中医?

在面对疾病时&#xff0c;很多人常常会犹豫不决&#xff0c;不知道应该选择中医还是西医进行治疗。与疾病斗争的过程也是一场“战斗”&#xff0c;需要选择合适的“武器”和策略。有些人认为西医疗效快&#xff0c;能够迅速缓解症状&#xff1b;而另一些人则认为中医治疗更根本…

千兆光模块和万兆光模块需要注意哪些事项

随着网络通信技术的发展&#xff0c;千兆光模块和万兆光模块已经成为了网络设备中不可或缺的关键组件。光模块的制造涉及到许多技术和工艺问题&#xff0c;需要严格的控制和管理。本文将从工艺流程、材料选用、测试认证等方面&#xff0c;详细介绍制造千兆光模块和万兆光模块需…

EasyCVR视频监控+AI智能分析网关如何助力木材厂安全生产?

旭帆科技有很多工厂的视频监管方案&#xff0c;小编也经常分享出来供大家参考。近期&#xff0c;又有伙伴后台私信我们想要关于木材厂的方案。针对木材厂的生产过程与特性以及安全风险等&#xff0c;我们来分享一下相关的监管方案&#xff1a; 1&#xff09;温湿度监测&#xf…

Java学习之路 —— IO、特殊文件

文章目录 1. I/O1.1 常用API1.2 I/O流1.2.1 字节流1.2.2 try-catch-finally和try-with-resource1.2.3 字符流1.2.4 其他的一些流 2. I/O框架3. 特殊文件3.1. Properties3.2 XML 1. I/O 1.1 常用API // 1. 创建文件对象File file new File("E:\\ComputerScience\\java\\…

LeetCode算法题解|LeetCode738. 单调递增的数字、LeetCode968. 监控二叉树

一、LeetCode738. 单调递增的数字 题目链接&#xff1a;738. 单调递增的数字 题目描述&#xff1a; 当且仅当每个相邻位数上的数字 x 和 y 满足 x < y 时&#xff0c;我们称这个整数是单调递增的。 给定一个整数 n &#xff0c;返回 小于或等于 n 的最大数字&#xff0c…