【蓝桥杯 第十三届省赛Java B组】真题训练(A - F)

目录

A、星期计算 - BigInteger

B、山 - 暴力判断 + 字符串

C、字符统计 - 简单哈希

D、最少刷题数 - 排序 + 思维 + 二分 + 分情况讨论

(1)(错误)自写哈希表

(2)正解 

E、求阶乘 - 数学思维 + 二分

F、最大子矩阵 - (没过)暴力


A、星期计算 - BigInteger

思路:

20^22用电脑自带的计算器也可以算,用Math.pow也可以,这里运用BigInteger

答案:7

import java.math.BigInteger;
import java.util.*;

public class abc {
	public static void main(String[] args)
	{
		Scanner sc=new Scanner(System.in);
		BigInteger n=new BigInteger("20");
		BigInteger res=new BigInteger("1");
		
		for(int i=0;i<22;i++) res=res.multiply(n);
		res=res.mod(new BigInteger("7"));
		
		System.out.print(res.intValue()+6);
	}
}

B、山 - 暴力判断 + 字符串

 思路:

暴力枚举【2022,2022222022】,用long,然后判断回文和单调性即可

用StringBuilder的reverse判断回文也是可以的

答案:3138

import java.math.BigInteger;
import java.util.*;

public class abc {
	public static void main(String[] args)
	{
		Scanner sc=new Scanner(System.in);
		long res=0;
		for(long i=2022;i<=2022222022;i++)
			if(ck(String.valueOf(i))) 
				res++;

		System.out.print(res);
	}
	public static boolean ck(String s)
	{
		boolean f=true;
		int n=s.length();
		for(int i=0;i<n/2;i++)
			if(s.charAt(i)!=s.charAt(n-1-i))
			{f=false;return f;}
		for(int i=1;i<=n/2;i++)
			if(s.charAt(i)<s.charAt(i-1)) 
			{
				f=false;break;
			}
		return f;
	}
	
}
import java.math.BigInteger;
import java.util.*;

public class abc {
	public static void main(String[] args)
	{
		Scanner sc=new Scanner(System.in);
		long res=0;
		for(long i=2022;i<=2022222022;i++)
			if(ck(String.valueOf(i))) 
				res++;

		System.out.print(res);
	}
	
	public static boolean ck(String s)
	{
		int n=s.length();
		StringBuilder ss=new StringBuilder(s);
		if(s.compareTo(ss.reverse().toString())!=0) return false;
		
		for(int i=1;i<=n/2;i++)
			if(s.charAt(i)<s.charAt(i-1)) 
				return false;
		return true;
	}
	
}

C、字符统计 - 简单哈希

import java.util.*;

public class abc {
	public static void main(String[] args)
	{
		Scanner sc=new Scanner(System.in);
		TreeMap<Character,Integer> mp=new TreeMap<>();
		String s=sc.next();
		int maxx=0;
		for(int i=0;i<s.length();i++)
		{
      char c=s.charAt(i);
			mp.put(c,mp.getOrDefault(c, 0)+1);
			if(mp.get(c)>maxx) maxx=mp.get(c);
		}
		String res=""; 
		for(Map.Entry<Character,Integer> x:mp.entrySet())
			if(x.getValue()==maxx) res+=x.getKey();
		
		System.out.print(res);
	}
	
}

D、最少刷题数 - 排序 + 思维 + 二分 + 分情况讨论

 

(1)(错误)自写哈希表

思路:

排序找出mid=a[n/2],然后小于mid的元素要么=mid要么=mid+1,这时候就要看情况了

我自己写的这个如果遇到

8
1 1 3 3 3 10 20 30

这个样例,答案输出的是:

2 2 0 0 0 0 0 0 

很明显是错误的,无法让刷题少的≥刷题多的

  • 我们需要分情况找出mid是+1还是=mid,这时候就需要统计比mid大的个数max_m和比mid小的个数min_m
  • 这个样例的mid是3,则max_m=3,min_m=2
  • 我们会发现此时如果a[i]≤mid,就需要令其等于mid+1,因为max_m>min_m,必须比mid大,才能让min_m增大
package demo_lanqiao;

import java.math.BigInteger;
import java.util.*;

public class abc {
	public static void main(String[] args)
	{
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int[] a=new int[n],res=new int[n],b=new int[n];
		Map<Integer,Integer> mp=new HashMap<>();
		for(int i=0;i<n;i++)
		{
			a[i]=sc.nextInt();b[i]=a[i];
		}
		Arrays.sort(a);
		for(int x:a) System.out.print(x+" ");
		System.out.println();
		int mid=a[n/2];
		for(int i=0;i<n;i++)
		{
			int x=0;
			if(n%2==0) x=a[i]<mid? mid-a[i]:0;
			else if(n%2==1) x=a[i]<mid? mid+1-a[i]:0;
			mp.put(a[i],x);
		}
		for(int i=0;i<n;i++) res[i]=mp.get(b[i]);
		for(int x:res) 
			System.out.print(x+" ");
	}
	
}

(2)正解 

思路:

        先排序找出中位数mid=a[n/2],用二分统计出大于mid的个数max_m,和小于mid的个数min_m,分情况讨论:

设res为a[i]最终刷题数

  • min_m < max_m     需要让≤mid的数比mid大1,这样才可保证res>mid,保证刷题多<刷题少
    • 8
    • 1 1 3 3 3 10 20 30
  • min_m == max_m  需要让<mid的数比mid大1,才能保证res>mid,刷题多<刷题少
    • 5
    • 1 2 3 4 5
  • min_m > max_m    只要让<mid的数=mid即可,这样既刷题多<刷题少,又能保证刷题数最少
    • 6
    • 1 1 1 2 4 5

蓝桥杯官网的测评机同一个代码每一次测的百分比都不一样。。。。

蓝桥杯2022年第十三届省赛真题-最少刷题数 - C语言网

import java.math.BigInteger;
import java.util.*;

public class abc {
	public static void main(String[] args)
	{
		Scanner sc=new Scanner(System.in);
		int n=sc.nextInt();
		int[] a=new int[n],t=new int[n];
		for(int i=0;i<n;i++)
		{
			a[i]=sc.nextInt();t[i]=a[i];
		}
		Arrays.sort(t);
		int mid=t[n/2];
		int min_m=findmin(t,mid),max_m=n-findmax(t,mid)-1;
		
		if(min_m<max_m) 
			for(int i=0;i<n;i++) 
				if(a[i]<=mid) System.out.print(mid-a[i]+1+" ");
				else System.out.print(0+" ");
		else if(min_m==max_m)
			for(int i=0;i<n;i++) 
				if(a[i]<mid) System.out.print(mid-a[i]+1+" ");
				else System.out.print(0+" ");
		else 
			for(int i=0;i<n;i++) 
				if(a[i]<mid) System.out.print(mid-a[i]+" ");
				else System.out.print(0+" ");

	}
	public static int findmax(int[] a,int tar)
	{
		int l=0,r=a.length-1;
		while(l<r)
		{
			int mid=l+r+1>>1;
			if(a[mid]<=tar) l=mid;
			else r=mid-1;
		}
		return l;
	}
	public static int findmin(int[] a,int tar)
	{
		int l=0,r=a.length-1;
		while(l<r)
		{
			int mid=l+r>>1;
			if(a[mid]>=tar) r=mid;
			else l=mid+1;
		}
		return r;
	}
	
}

E、求阶乘 - 数学思维 + 二分

思路:

题目越短,难度越大,看数据范围就知道主打就是一个不会(暴力无法做)

思路参考:

蓝桥杯刷题014——求阶乘(二分法)-CSDN博客

很明显末尾0的出现跟因子2和5息息相关,因为2×5=10,其他数无论怎么乘都不可能出0

每个数字末尾的每个0都可以看成是2和5相乘得到

结论:给定一个数的阶乘,计算它的因子中2*5出现的次数,即可确定末尾0的个数 

而因子2无需寻找,因为相乘关系2,4,6,8中都存在2,2肯定比5多

【求N的阶乘尾部0的个数】转换为【求N的阶乘中因子5的个数】
        我们可知:1~24中每隔5个就有1个5(分别是5 10 15 20共4个),而25能分出2个5,因此25!=末尾6个0,没有5个0,如下图

为什么这样算?

【第一轮除5】我们先把含有1个及以上5的25个数全部取出一个5加到总数num,那么本来1个5的数就变成0个(可以忽略),本来2个5的数变成1个5的数,本来3个5的变成2个5的。

【第二轮除5】再对原本含有2个及以上5的5个数(现在是含有一个及以上5的数)操作一次,只剩下1个含5的数

【第三轮除5】最后再对含5的1个数取出一个5加到总数num,这样就把全部的因子5转移到了总数num

结论:求N的阶乘中因子5的个数,将N每次除以5的商求和(N中5因子的个数)即可。

因为k值很大,我们不可能枚举所有情况,而k随N增大而增加,具有单调性,可以用二分

找出≥check()的最小值【用r=mid模板】 ,检查mid末尾0的个数是否==k,如果不是返回-1

import java.util.*;

public class abc {
	public static void main(String[] args)
	{
		Scanner sc=new Scanner(System.in);
		long k=sc.nextLong();
		long l=1,r=Long.MAX_VALUE-1;
		while(l<r)
		{
			long mid=l+r>>1;
			if(ck(mid)>=k) r=mid;
			else l=mid+1;
		}
		if(ck(r)!=k) System.out.print(-1);
		else System.out.print(r);
	}
	
	public static long ck(long n)
	{
		long res=0;
		while(n!=0)
		{
			res+=n/5;
			n/=5;
		}
		return res;
	}
	
}

F、最大子矩阵 - (没过)暴力

 

 

六个for暴力拿10%

import java.util.*;

public class abc {
	public static void main(String[] args)
	{
		Scanner sc=new Scanner(System.in);
		int[][] g=new int[80][80];
		TreeMap<Integer,Integer> mp=new TreeMap<>();
		int n=sc.nextInt(),m=sc.nextInt();
		for(int i=0;i<n;i++)
			for(int j=0;j<m;j++) g[i][j]=sc.nextInt();
		int limit=sc.nextInt();
		int res=0;
		
		for(int up=0;up<n;up++)
			for(int dw=up;dw<n;dw++)
				for(int l=0;l<m;l++)
					for(int r=l;r<m;r++)
					{
						int max=0,min=Integer.MAX_VALUE;
						for(int i=up;i<=dw;i++)
							for(int j=l;j<=r;j++)
							{
								if(g[i][j]>max) max=g[i][j];
								if(g[i][j]<min) min=g[i][j];
							}
              
						if(max-min>=0&&max-min<=limit&&(dw-up+1)*(r-l+1)>res)
							{
								res=(dw-up+1)*(r-l+1);
								//System.out.println("["+max+","+min+"]"+up+" "+dw+" "+l+" "+r+" "+res);
							}
					}
		System.out.print(res);
	}
	
	
	
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SAP实现文本框多行输入(类cl_gui_textedit)

参考文章&#xff1a;https://blog.csdn.net/SAPmatinal/article/details/130882962 先看效果&#xff0c;在输入框先来一段《赤壁赋》 然后点击 ‘保存输出’按钮&#xff0c;就能把输入内容从表里读取并输出来 源代码&#xff1a; *&-------------------------------…

多个div横向排列的几种方法

以下面这组 div 为例&#xff0c;group的高度由内容撑开 <div id"group"><div id"div1">div1</div><div id"div2">div2</div><div id"div3">div3</div> </div>显示结果如下为上下排…

Go常见数据结构的实现原理——map

&#xff08;一&#xff09;基础操作 版本&#xff1a;Go SDK 1.20.6 1、初始化 map分别支持字面量初始化和内置函数make()初始化。 字面量初始化&#xff1a; m : map[string] int {"apple": 2,"banana": 3,}使用内置函数make()初始化&#xff1a; m …

19.删除链表的倒数第N个结点(LeetCode)

想法一 先用tail指针找尾&#xff0c;计算出节点个数&#xff0c;再根据倒数第N个指定删除 想法二 根据进阶的要求&#xff0c;只能遍历一遍链表&#xff0c;那刚刚想法一就做不到 首先&#xff0c;我们要在一遍内找到倒数第N个节点&#xff0c;所以我们设置slow和fast两个指…

Python----元组的定义与使用

1、为什么需要元组 思考&#xff1a;如果想要存储多个数据&#xff0c;但是这些数据是不能修改的数据&#xff0c;怎么做&#xff1f; 首先&#xff0c;列表可以一次性存储多个数据&#xff0c;但是列表中的数据允许更改。 相关链接&#xff1a;Python--列表及其应用场景-CS…

Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks - 翻译学习

知识密集型NLP任务的检索增强生成 - 论文学习 文章目录 Abstract1 Introduction2 Methods2.1 Models2.2 Retriever: DPR2.3 Generator: BART2.4 Training2.5 Decoding 3 Experiments3.1 Open-domain Question Answering3.2 Abstractive Question Answering3.3 Jeopardy Questio…

[工业自动化-14]:西门子S7-15xxx编程 - 软件编程 - STEP7 TIA博途是全集成自动化软件TIA portal快速入门

目录 一、TIA博途是全集成自动化软件TIA portal快速入门 1.1 简介 1.2 软件常用界面 1.3 软件安装的电脑硬件要求 1.4 入口 1.5 主界面 二、PLC软件编程包含哪些内容 2.1 概述 2.2 电机运动控制 一、TIA博途是全集成自动化软件TIA portal快速入门 1.1 简介 Siemens …

Leetcode -463.岛屿的周长 - 476.数字的补码

Leetcode Leetcode -463.岛屿的周长Leetcode - 476.数字的补码 Leetcode -463.岛屿的周长 题目&#xff1a;给定一个 row x col 的二维网格地图 grid &#xff0c;其中&#xff1a;grid[i][j] 1 表示陆地&#xff0c; grid[i][j] 0 表示水域。 网格中的格子 水平和垂直 方向…

小样本目标检测(Few-Shot Object Detection)综述

背景 前言:我的未来研究方向就是这个,所以会更新一系列的文章,就关于FSOD,如果有相同研究方向的同学欢迎沟通交流,我目前研一,希望能在研一发文,目前也有一些想法,但是具体能不能实现还要在做的过程中慢慢评估和实现.写文的主要目的还是记录,避免重复劳动,我想用尽量简洁的语言…

MATLAB的编程与应用,匿名函数、嵌套函数、蒙特卡洛法的掌握与使用

目录 1.匿名函数 1.1.匿名函数的定义与分类 1.2.匿名函数在积分和优化中应用 2.嵌套函数 2.1.嵌套函数的定义与分类 2.2.嵌套函数彼此调用关系 2.3.嵌套函数在积分和微分中应用 3.微分和积分 4.蒙特卡洛法 4.1.圆周率的模拟 4.2.计算N重积分&#xff08;均匀分布&am…

计算机毕业设计 基于Springboot的影院购票管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…

【入门Flink】- 09Flink水位线Watermark

在窗口的处理过程中&#xff0c;基于数据的时间戳&#xff0c;自定义一个“逻辑时钟”。这个时钟的时间不会自动流逝&#xff1b;它的时间进展&#xff0c;就是靠着新到数据的时间戳来推动的。 什么是水位线 用来衡量事件时间进展的标记&#xff0c;就被称作“水位线”&#x…

AIGC ChatGPT 4 轻松实现小游戏开发制作

贪吃蛇的小游戏相信大家都玩儿过,我们让ChatGPT4来帮我们制作一个贪吃蛇的小游戏。 在ChatGPT中发送Prompt如下图: 完整代码如下: <!DOCTYPE html> <html> <head> <title>贪吃蛇游戏</title> <style type="text/css"> #can…

UPLAOD-LABS2

less7 任务 拿到一个shell服务器 提示 禁止上传所有可以解析的后缀 发现所有可以解析的后缀都被禁了 查看一下源代码 $is_upload false; $msg null; if (isset($_POST[submit])) {if (file_exists($UPLOAD_ADDR)) {$deny_ext array(".php",".php5&quo…

第一百六十九回 如何修改NavigationBar的形状

文章目录 1. 概念介绍2. 使用方法3. 代码与效果3.1 示例代码3.2 运行效果 4. 内容总结 我们在上一章回中介绍了"如何修改按钮的形状"相关的内容&#xff0c;本章回中将介绍NavigationBar组件.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章…

javaEE案例,前后端交互,计算机和用户登录

加法计算机,前端的代码如下 : 浏览器访问的效果如图 : 后端的代码如下 再在浏览器进行输入点击相加,就能获得结果 开发中程序报错,如何定位问题 1.先定位前端还是后端(通过日志分析) 1)前端 : F12 看控制台 2)后端 : 接口,控制台日志 举个例子: 如果出现了错误,我们就在后端…

WebSocket是什么以及其与HTTP的区别

新钛云服已累计为您分享774篇技术干货 HTTP协议 HTTP是单向的&#xff0c;客户端发送请求&#xff0c;服务器发送响应。举个例子&#xff0c;当用户向服务器发送请求时&#xff0c;该请求采用HTTP或HTTPS的形式&#xff0c;在接收到请求后&#xff0c;服务器将响应发送给客户端…

Linux技能篇-yum源搭建(本地源和公网源)

文章目录 前言一、yum源是什么&#xff1f;二、使用镜像搭建本地yum源1.搭建临时仓库第一步&#xff1a;挂载系统ios镜像到虚拟机第二步&#xff1a;在操作系统中挂载镜像第三步&#xff1a;修改yum源配置文件 2.搭建本地仓库第一步&#xff1a;搭建临时yum源来安装httpd并做文…

在Win11中使用docker安装Oracle19c

在Win11中使用docker安装Oracle19c 首先是去docker官网下 docker for windows安装oracle19c首先下载image运行镜像在工具中登录可能遇到的问题 首先是去docker官网下 docker for windows 官网&#xff1a; https://www.docker.com/get-started/ 如果Windows是专业版&#xff0…

【Git】Git使用Gui图形化界面,Git中SSH协议,Idea集成Git

一&#xff0c;Git使用Gui图形化界面 1.1 Gui的简介 Gui &#xff08;Graphical User Interface&#xff09;指的是图形用户界面&#xff0c;也就是指使用图形化方式来协同人和计算机进行交互的一类程序。它与传统的命令行界面相比&#xff0c;更加直观、易用&#xff0c;用户…