草庐IT

2023年第十四届蓝桥杯将至,来看看第十三届蓝桥杯javaB组题目如何

quicklysleep 2024-07-19 原文

ฅ(๑˙o˙๑)ฅ 大家好, 欢迎大家光临我的博客:面向阿尼亚学习
算法学习笔记系列持续更新中~


文章目录


一、前言

过两天就要考蓝桥杯了,今年报的java组,今天上午做了一套第十三届蓝桥杯javaB组真题
分享一下

2道填空,8道编程


二、2022年蓝桥杯javaB组省赛真题目录

A、B为填空题

A:星期计算[5分]

思路⭐

本人用的快速幂取余7
然后看看比星期六多几天就可以了

代码🌟

import java.util.Scanner;

public class Main {

	static long qpow(int a, int b, int p) {
		long sum = 1;
		while (b != 0) {
			if ((b & 1) == 1) {
				sum = sum * a % p;
			}
			a = a * a % p;
			b >>= 1;
		}
		return sum;
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		System.out.println(qpow(20, 22, 7));
	}

}

答案:7

B 山(5分)

思路⭐

模拟
写两个check函数
暴力枚举符合条件的

代码🌟

import java.util.Scanner;

public class Main {

	static boolean check1(int x) {
		String s = Integer.toString(x);
		char c[] = s.toCharArray();
		int j = c.length - 1;
		for (int i = 0; i < j; i++, j--) {
			if (c[i] != c[j])
				return false;
		}
		return true;
	}

	static boolean check2(int x) {
		String s = Integer.toString(x);
		char c[] = s.toCharArray();
		int len = s.length();
		int mid;
		if (len % 2 == 0)
			mid = len / 2;
		else {
			mid = len / 2 + 1;
		}

		for (int i = 0; i < mid - 1; i++) {
			if (c[i] > c[i + 1])
				return false;
		}
		return true;

	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);

		int ans = 0;
		for (int i = 2022; i <= 2022222022; i++) {
			if (check1(i)) {
				if (check2(i)) {
					ans++;

					System.out.println(i);
				}

//				System.out.println(i);
			}
		}
		System.out.println(ans);

	}

}
//3138

答案:3138


以下为编程题

C 字符统计(10分)

思路⭐

开个哈希表存储每个字母出现的次数
然后遍历两次
第一次求出现次数的最大值
第二次将出现次数等于最大值的字母输出即可

代码🌟

import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;

public class Main {

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		String s = sc.next();

		Map<Character, Integer> mp = new HashMap<>();

		char[] c = s.toCharArray();

		for (char o = 'A'; o <= 'Z'; o++) {
			mp.put(o, 0);
		}

		for (int i = 0; i < s.length(); i++) {
			int x = mp.get(c[i]);
			x++;
			mp.put(c[i], x);
		}

		int maxx = -1;
		for (char o = 'A'; o <= 'Z'; o++) {
			maxx = Math.max(maxx, mp.get(o));
		}

		for (char o = 'A'; o <= 'Z'; o++) {

			if (mp.get(o) == maxx)
				System.out.print(o);
		}
	}
}

D 最小刷题数(10分)

思路⭐

记录刷不同题目同学的数量
然后对其求前缀和
然后可以在O(1)的时间范围求出比某个同学刷题数多的同学
或者比他刷题少的同学
然后二分求解刷题数,结果减去原本的刷题数即可

代码🌟

import java.io.*;

public class Main {
	static int N = 200010;
	static int[] a = new int[N], cnt = new int[N];
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));

	public static void main(String[] args) throws IOException {
		int n = Integer.parseInt(br.readLine());
		String[] s = br.readLine().split(" ");
		for (int i = 0; i < n; i++) {// 输入每个同学的刷题数保存到 a 数组中
			a[i] = Integer.parseInt(s[i]);
			cnt[a[i]]++;
		}
		// 前缀和
		for (int i = 1; i <= 100000; ++i) {
			cnt[i] += cnt[i - 1];
		}
		for (int i = 0; i < n; ++i) {

			// 如果比他刷题多的同学不大于比他小的同学,就不需要刷题了,直接输出0
			if (cnt[100000] - cnt[a[i]] <= cnt[Math.max(0, a[i] - 1)]) {
				out.print(0 + " ");
				continue;
			}
			// 否则进行二分
			int l = a[i], r = 100000;

			while (l + 1 < r) {// 开区间
				int mid = l + r >> 1;

				if (cnt[100000] - cnt[mid] <= cnt[mid - 1] - 1) {
					r = mid;
				} else {
					l = mid;
				}

			}

			out.print((r - a[i]) + " ");
		}
		out.flush();
	}
}

E 求阶乘(15分)

思路⭐

求后缀0的个数,我们可以根据阶乘的因子中2和5的个数确实,因为2*5=10,后缀多一个0
而2的个数要多于5的个数,所有只要求5的个数即可
因此后缀0的个数与n存在单调关系可以二分求
注意开long

代码🌟

import java.util.Scanner;

public class Main {

	static long k;

	// 求阶乘末尾0的个数其实就是求阶乘因子中5的个数
	static boolean check(long x) {
		long res = 0;
		//欧几里得公式
		while (x != 0) {
			res += x / 5;
			x /= 5;
		}
		return res >= k;
	}

	static long find() {
		long l = 1, r = Long.MAX_VALUE - 4;

		while (l + 1 < r) {
			long mid = (l + r) / 2;
			if (check(mid)) {
				r = mid;
			} else {
				l = mid;
			}
		}
		return r;
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		k = sc.nextLong();

// 	  System.out.println(find());

		long ans = 0;
		long p = find();

		while (p != 0) {
			ans += p / 5;
			p /= 5;
		}

		if (ans != k)
			System.out.println(-1);
		else {

			System.out.println(find());
		}

	}

}

F 最大子矩阵(15分)


思路⭐

暴力
四个循环

代码🌟

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Main {
	static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
	static BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));

	public static void main(String[] args) throws IOException {
		String[] ss = in.readLine().split(" ");
		int n = Integer.parseInt(ss[0]);
		int m = Integer.parseInt(ss[1]);

		int[][] g = new int[n][m];
		for (int i = 0; i < n; i++) {
			ss = in.readLine().split(" ");
			for (int j = 0; j < m; j++)
				g[i][j] = Integer.parseInt(ss[j]);
		}
		int limit = Integer.parseInt(in.readLine());
		int res = 1;

		for (int i = 0; i < n; i++)// 枚举 行首
			for (int j = 0; j < m; j++)// 枚举 列首
				for (int x = i; x < n; x++)// 枚举 行尾
				{
					int kx = Integer.MAX_VALUE;
					int ky = Integer.MAX_VALUE;

					for (int y = j; y < m; y++)// 枚举 列尾
					{
						if (x >= kx && y >= ky)
							continue;

						if (check(g, i, j, x, y) <= limit)// 判断最大差
						{
							res = Math.max(res, (x - i + 1) * (y - j + 1));
						} else {
							kx = x;
							ky = y;
							break;
						}
					}
				}

		System.out.println(res);
	}

	private static int check(int[][] g, int xs, int ys, int xe, int ye) {
		int max = Integer.MIN_VALUE;
		int min = Integer.MAX_VALUE;

		for (int i = xs; i <= xe; i++)
			for (int j = ys; j <= ye; j++) {
				max = Math.max(max, g[i][j]);
				min = Math.min(min, g[i][j]);
			}

		return max - min;
	}

}

G 数组切分(20分)


思路⭐

如果是一段连续的自然数,满足这段区间的最大值-最小值=区间长度
然后进行动态规划

代码🌟

import java.util.Scanner;

public class Main {
	static final int N = 10007;
	static final int mod = 1000000007;
	static int[] a = new int[N];
	static int[] f = new int[N];

	public static void main(String[] args) {

		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();

		for (int i = 1; i <= n; i++)
			a[i] = sc.nextInt();

		f[0] = 1;
		for (int i = 1; i <= n; i++) {
			int maxx = Integer.MIN_VALUE;
			int minn = Integer.MAX_VALUE;
			for (int j = i; j >= 1; j--) {
				maxx = Math.max(maxx, a[j]);
				minn = Math.min(minn, a[j]);
				if (maxx - minn == i - j)
					f[i] = (f[i] + f[j - 1]) % mod;
			}
		}
		System.out.println(f[n]);
	}
}

H 回忆迷宫 (20分)


思路⭐

构造题
用数组表示状态

static int[][] a=new int[N][N];// 0表示没填,1表示空地,2表示墙,3表示墙外的点(外面的墙)

最后的输出

if(a[i][j] == 1 || a[i][j] == 3) System.out.printf(" "); //空地和外面的墙都要画空格
	                else System.out.printf("*"); //只要不是外面的墙,那么画墙

状态计算模拟即可

代码🌟


import java.util.Scanner;

public class Main {
	
	
	static final int N=507;
	
	static int[][] a=new int[N][N];// 0表示没填,1表示空地,2表示墙,3表示墙外的点(外面的墙)
	
	static int[] dx= {1,0,-1,0};
	static int[] dy= {0,1,0,-1};
	
	static int  maxD=-1,maxR=-1;
	static int minU=507,minL=507;

	
    static void bfs(int sx, int sy) // 将围在墙外的点标记为3
    {
        PII[] q = new PII[N * N];
        
        int hh = 0, tt = -1;
        q[++ tt] = new PII(sx, sy);

        while(hh <= tt)
        {
            PII t = q[hh ++];

            int x = t.x, y = t.y;
            for(int i = 0; i < 4; i ++) {
            	
                int xx = x + dx[i], yy = y + dy[i];
                if(xx >= 0 && xx <=500 && yy >= 0 && yy <=500 && a[xx][yy] == 0) {
                    a[xx][yy] = 3;
                    q[++ tt] = new PII(xx, yy);
                }
            }
        }
    }

	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		int n = sc.nextInt();
		
		String s = sc.next();
		
		
//		System.out.println(s);
		int x=200,y=200;
	
		a[x][y]=1;
		char c[]=s.toCharArray();
		
		
		for(int i=0;i<n;i++){
			if(c[i]=='U')
			{
				x--;
				a[x][y]=1;
			}
			else if(c[i]=='D')
			{
				x++;
				a[x][y]=1;
			}
			else if(c[i]=='L')
			{
				y--;
				a[x][y]=1;
			}
			else if(c[i]=='R'){
				y++;
				a[x][y]=1;
			}
		}
		
//		int maxD=-1,maxR=-1;
//		int minU=507,minL=507;
		
		
		for(int i=0;i<=500;i++)
		{
			for(int j=0;j<=500;j++)
			{
				if(a[i][j]==1)
				{
					
					maxD=Math.max(maxD, i);
					maxR=Math.max(maxR, j);
					minU=Math.min(minU, i);
					minL=Math.min(minL, j);
					
					for(int k=0;k<4;k++)
					{
						int xx=i+dx[k];
						int yy=j+dy[k];
						if(a[xx][yy]!=1)
						{
							a[xx][yy]=2;
						}
					}
				}
				
			}
		}
		
		
		bfs(0, 0);
		
		
//		System.out.println(minU-1);
//		System.out.println(maxD+1);
//		System.out.println(minL-1);
//		System.out.println(maxR+1);
		
		
		
		for(int i=minU-1;i<=maxD+1;i++)
		{
			for(int j=minL-1;j<=maxR+1;j++)
			{
				
				 if(a[i][j] == 1 || a[i][j] == 3) System.out.printf(" "); //空地和外面的墙都要画空格
	                else System.out.printf("*"); //只要不是外面的墙,那么画墙
				
//				System.out.print(a[i][j]);
			}
			System.out.println();
		}
		
		
		/*
17
UUUULLLLDDDDRRRRU


20
RRULUDLLULLRUURUULLU


		*/

	}
}

class PII {
    int x, y;
    PII(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

I 红绿灯(25分)



思路⭐

%%%

代码🌟


J 拉箱子(25分)



思路⭐

%%%

代码🌟


最后

祝考的都会

有关2023年第十四届蓝桥杯将至,来看看第十三届蓝桥杯javaB组题目如何的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  5. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  8. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  9. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  10. ruby - 如何使用文字标量样式在 YAML 中转储字符串? - 2

    我有一大串格式化数据(例如JSON),我想使用Psychinruby​​同时保留格式转储到YAML。基本上,我希望JSON使用literalstyle出现在YAML中:---json:|{"page":1,"results":["item","another"],"total_pages":0}但是,当我使用YAML.dump时,它不使用文字样式。我得到这样的东西:---json:!"{\n\"page\":1,\n\"results\":[\n\"item\",\"another\"\n],\n\"total_pages\":0\n}\n"我如何告诉Psych以想要的样式转储标量?解

随机推荐