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

这篇具有很好参考价值的文章主要介绍了【蓝桥杯 第十五届模拟赛 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

【蓝桥杯 第十五届模拟赛 Java B组】训练题(A - I),蓝桥杯真题,算法,深度优先,蓝桥杯,java,dfs,职场和发展,leetcode

思路:

注意特判整除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? 

【蓝桥杯 第十五届模拟赛 Java B组】训练题(A - I),蓝桥杯真题,算法,深度优先,蓝桥杯,java,dfs,职场和发展,leetcode

思路:

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、清理水域 - 暴力(弱智版) 可以差分

【蓝桥杯 第十五届模拟赛 Java B组】训练题(A - I),蓝桥杯真题,算法,深度优先,蓝桥杯,java,dfs,职场和发展,leetcode

【蓝桥杯 第十五届模拟赛 Java B组】训练题(A - I),蓝桥杯真题,算法,深度优先,蓝桥杯,java,dfs,职场和发展,leetcode

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

【蓝桥杯 第十五届模拟赛 Java B组】训练题(A - I),蓝桥杯真题,算法,深度优先,蓝桥杯,java,dfs,职场和发展,leetcode

输入格式
  输入第一行包含两个整数 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]即可文章来源地址https://www.toymoban.com/news/detail-754421.html

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];

    }
}

到了这里,关于【蓝桥杯 第十五届模拟赛 Java B组】训练题(A - I)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 第十五届蓝桥杯模拟赛(第一期)Python

    创作不易,欢迎小伙伴们关注、点赞+收藏! 问题描述 请找到一个大于 2022 的最小数,这个数转换成十六进制之后,所有的数位(不含前导 0)都为字母(A 到 F)。 请将这个数的十进制形式作为答案提交。 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可。本

    2024年02月05日
    浏览(39)
  • 第十五届蓝桥杯模拟赛(第一期 C++)

    问题描述 请找到一个大于 2022 的最小数,这个数转换成十六进制之后,所有的数位(不含前导 0)都为字母(A 到 F)。请将这个数的十进制形式作为答案提交。    答案: 2730 思路分析: 直接暴力秒了 问题描述 在 Excel 中,列的名称使用英文字母的组合。前 26 列用一个字母

    2024年02月05日
    浏览(31)
  • 第十五届蓝桥杯模拟赛(第二期)第5题(Python)

    最难的才有挑战性,才值得学习! 小蓝有一个01矩阵。他打算将第一行第一列的 0 变为 2 。变化过程有传染性,每次 2 的上下左右四个相邻的位置中的 0 都会变成 2 。直到最后每个 2 的周围都是 1 或 2 结束。 请问,最终矩阵中有多少个 2 ? 以下是小蓝的矩阵,共 30 行 40 列。

    2024年02月04日
    浏览(30)
  • 第十五届蓝桥杯模拟赛B组(第二期)C++

    前言: 第一次做蓝桥模拟赛的博客记录,可能有很多不足的地方,现在将第十五届蓝桥杯模拟赛B组(第二期)的题目与代码与大家进行分享,我是用C++做的,有好几道算法题当时自己做的也是一脸懵,所以有好个别几道也是请教了其他大佬才分享出来的。 目录 ​编辑 一、

    2024年02月05日
    浏览(32)
  • 【蓝桥杯Web】第十五届蓝桥杯(Web 应用开发)模拟赛 2 期 | 全部题解

    感觉蓝桥杯的模拟赛一次比一次难了😑 制作不易,代码都是纯手敲,觉得有帮助的伙伴们记得点个赞评论一下,谢谢大家支持😍 话不多说直接上答案 目录 1、想不相等 2、三行情书 3、电影院在线订票 4、老虎机 5、星际通讯 6、蓝桥杯排位赛 7、拼出一个未来 8、超能英雄联

    2024年02月05日
    浏览(34)
  • 第十五届蓝桥杯(Web 应用开发)模拟赛 2 期-大学组(详细分析解答)

    目录  1.相不相等 1.1 题目要求 1.2 题目分析 1.3 源代码 2.三行情书 2.1 题目要求 2.2 题目分析 2.3 源代码 3.电影院在线订票 3.1 题目要求 3.2 题目分析 3.3 源代码  4.老虎坤(不然违规发不出来) 4.1 题目要求 4.2 题目分析 4.3 源代码 5.星际通讯 5.1 题目要求 5.2 题目分析 5.3 源代码

    2024年02月05日
    浏览(23)
  • 2023第十四届蓝桥杯模拟赛第二期个人题解(Java实现)

    2023第十四届蓝桥杯校内模拟赛第三期个人题解(Java实现) 蓝桥杯真题——单词分析(Java实现) 这篇文章为个人题解,假如我写的解法有误,欢迎大家在评论区指正👏👏!!!希望这篇文章对你有帮助❤❤ 请找到一个大于 2022 的最小数,这个数转换成二进制之后,最低的

    2023年04月23日
    浏览(25)
  • 第十四届蓝桥杯模拟赛(第三期)(大学B组)Java组

    修改了第六题余数为0时输出应为7的问题 修改了第五题和第九题可能超时的问题 前些天参加了第十四届蓝桥杯模拟赛(第三期),收获颇丰,自己也走了一点点弯路,记录一下自己考试中犯的一些错误。也希望在这期间可以提高一下自己的编程水平。 纯小白大佬请喷! 问题

    2023年04月24日
    浏览(30)
  • 第十四届蓝桥杯模拟赛(第一期)——C语言版

    问题描述 十进制整数 2 在十进制中是 1 位数,在二进制中对应 10 ,是 2 位数。 十进制整数 22 在十进制中是 2 位数,在二进制中对应 10110 ,是 5 位数。 请问十进制整数 2022 在二进制中是几位数? 答案提交 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果

    2023年04月09日
    浏览(37)
  • 第十四届蓝桥杯单片机第二场模拟赛程序

    第十四届蓝桥杯单片机第二场模拟赛程序(少量bug) 题目来源于4T评测网 www.4t.wiki 使用大赛组委会提供的国信长天单片机竞赛实训平台,完成本试题的程序设计与调试。程序编写、调试完成后,选手需通过考试系统提交以准考证号命名的hex文件。不符合以上文件提交要求的作

    2023年04月14日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包