0
点赞
收藏
分享

微信扫一扫

2022第13届蓝桥杯Java省赛B组个人题解

文章目录

A. 星期计算

在这里插入图片描述
思路解析:

答案:

代码:

package lanqiao;

import java.math.BigInteger;
//答案:6+1=7
public class A_星期计算 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		BigInteger num = new BigInteger("20");
		BigInteger ans = new BigInteger("1");
		for(int i=1;i<=22;i++) {
			ans = ans.multiply(num);
		}
		System.out.println(ans);
		System.out.println(ans.mod(new BigInteger("7")));
	}
}

B. 山

在这里插入图片描述
思路解析:

答案:

代码:

package lanqiao;

public class B_山 {
	//答案:3138
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		long ans=0;
		for(long i=2022;i<=2022222022;i++) {
			if(check(i)) {
				ans++;
			}
		}
		System.out.println(ans);
	}

	private static boolean check(long i) {
		//判断是否回文
		String string = String.valueOf(i);
		StringBuilder sBuilder = new StringBuilder(string);
		if(string.compareTo(sBuilder.reverse().toString())==0) {  //是回文数
			for(int j=0;j<string.length()/2;j++) {
				int pre = Integer.valueOf(string.charAt(j));
				int aft = Integer.valueOf(string.charAt(j+1));
				if(aft<pre)
					return false;
			}
			System.out.println(i);
			return true;
		}
		return false;
	}

}

C. 字符统计

在这里插入图片描述
思路解析:

代码:

/**
 * 
 */
package lanqiao;


import java.util.HashMap;

import java.util.Map;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

public class C_字符统计 {


	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		String string = scanner.next();
		Map<Character, Integer> map = new HashMap<>();
		int ans_count = Integer.MIN_VALUE;
		for(int i=0;i<string.length();i++) {
			char c = string.charAt(i);
			if(map.get(c)==null) {
				map.put(c, 1);
			}else {
				map.put(c, map.get(c)+1);
			}
			if(map.get(c)>ans_count) {
				ans_count=map.get(c);
			}
		}
		Set<Character> ansCharacters = new TreeSet<>();
		for(Map.Entry<Character, Integer> entry:map.entrySet()) {
			if(entry.getValue()==ans_count) {
				ansCharacters.add(entry.getKey());
			}
		}
		for(Character c:ansCharacters) {
			System.out.print(c);
		}
		

	}

}

D. 最少刷题数

在这里插入图片描述
思路解析:

代码:

package lanqiao;

import java.util.Arrays;
import java.util.Scanner;

public class D_最少刷题数 {

	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		int N=scanner.nextInt();
		int[] arr = new int[N];
		int[] find = new int[N];
		for(int i=0;i<N;i++) {
			int num = scanner.nextInt();
			arr[i]=num;
			find[i]=num;
		}
		Arrays.sort(find);
		for(int i=0;i<N;i++) {
			//在find中查找arr[i]的位置
			int pos = Arrays.binarySearch(find, arr[i]);
			//计算其左边的数
			int less = pos;
			int more = N-pos-1;
			if(more>less) {  //刷题多的多余刷题少的
				int d = more-less;
				int num = find[pos+d/2]-find[pos]+1;
				System.out.print(num+" ");
			}else {
				System.out.print(0+" ");
			}
		}
	}

}

E. 求阶乘

在这里插入图片描述
思路解析:

代码:

package lanqiao;

import java.util.Scanner;

public class E_求阶乘 {
	static int[] rec;
	//一个2与一个5可以产生一个0;在N的阶乘中,2的数目肯定多余5的数目,所以考虑5的数目就可以
	public static void main(String[] args) {
		rec=new int[100000000];
		Scanner scanner=new Scanner(System.in);
		long k=scanner.nextLong();
		int num=5;
		rec[5]=1;
		while(k>0) {
			int count = f(num);  //计算num中含有多少个5
			k-=count;
			if(k<=0)break;
			num+=5;
		}
		if(k<0) {
			System.out.println(-1);
		}else {
			System.out.println(num);
		}
	}

	private static int f(int num) {
		if(rec[num]!=0||num<5) {
			return rec[num];
		}
		if(num%5==0) {
			int res = 1+f(num/5);
			rec[num]=res;
			return res;
		}else {
			rec[num]=0;
			return 0;
		}
		
		
	}

}

F. 最大子矩阵

在这里插入图片描述思路解析:

代码:

package lanqiao;

import java.util.Scanner;

public class F_最大子矩阵 {
	static int[][] arr;
	public static void main(String[] args) {
		Scanner scanner=new Scanner(System.in);
		int N=scanner.nextInt();
		int M=scanner.nextInt();
		arr=new int[N][M];
		for(int i=0;i<N;i++) {
			for(int j=0;j<M;j++) {
				arr[i][j]=scanner.nextInt();
			}
		}
		int limit = scanner.nextInt();
		int max_are = Integer.MIN_VALUE;
		for(int i=N;i>0;i--) {
			for(int j=M;j>0;j--) { // i*j的矩阵
				for(int x=0;x<=N-i;x++) {
					for(int y=0;y<=M-j;y++) {  //左上角坐标
						int max = find_max(i,j,x,y);
						int min = find_min(i,j,x,y);
						if((max-min)<=limit) {
							max_are = Math.max(max_are, i*j);
//							System.out.println(x+" "+y+" "+" "+i+" "+j);
//							System.out.println(i*j);
//							return;
						}
					}
				}
			}
		}
		System.out.println(max_are);

	}
	private static int find_min(int i, int j, int x, int y) {
		// TODO //寻找最小值
		int res = Integer.MAX_VALUE;
		for(int n=x;n<x+i;n++) {
			for(int m=y;m<y+j;m++) {
				res = Math.min(res, arr[n][m]);
			}
		}
		return res;
	}
	private static int find_max(int i, int j, int x, int y) {
		// TODO 寻找最大值
		int res = Integer.MIN_VALUE;
		for(int n=x;n<x+i;n++) {
			for(int m=y;m<y+j;m++) {
				res = Math.max(res, arr[n][m]);
			}
		}
		return res;
	}

}

G. 数组切分

在这里插入图片描述
思路解析:

代码:

/**
 * 
 */
package lanqiao;

import java.util.Arrays;
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;

public class G_数组切分 {

	static boolean[] vis;

	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		int N = scanner.nextInt();
		int[] arr = new int[N];
		vis = new boolean[N];
		for (int i = 0; i < N; i++) {
			arr[i] = scanner.nextInt();
		}
		long ans = DFS(arr, 0);
		System.out.println(ans);

	}

	private static long DFS(int[] arr, int k) {
		if (k == arr.length-1) {
			if (check(arr)) {
//				for(int i=0;i<vis.length;i++) {
//					System.out.print(vis[i] + " ");
//				}
//				System.out.println();
				return 1;
			}
			return 0;
		}
		// 当前位置切
		int res = 0;
		vis[k] = true;
		res += DFS(arr, k + 1);
		// 当前位置不切
		vis[k] = false;
		res += DFS(arr, k + 1);
		return res;
	}

	private static boolean check(int[] arr) {
		// TODO 检查当前切法是否符合规则
		int len = arr.length;
		int p = 0;
		int q = 1;
		while (q < len) {
			if (vis[q - 1]) {
				if (!check_lianxu(arr, p, q)) {
					return false;
				}
				p=q;
			}
			q++;
		}
		if(!check_lianxu(arr, p, q)) {
			return false;
		}
		return true;
	}

	private static boolean check_lianxu(int[] arr, int p, int q) {
		// TODO 检测数组是否连续p-q

		int[] arrcopy = new int[q-p];
		System.arraycopy(arr, p, arrcopy, 0, q-p);
		Arrays.sort(arrcopy);
		for(int i=0;i<q-p-1;i++) {
			if(arrcopy[i+1]-arrcopy[i]!=1) {
				return false;
			}
		}
		return true;
	}

}

H. 回忆迷宫

在这里插入图片描述

时间能力有限,今年难度明显增加,实在没时间去做

I. 红绿灯

在这里插入图片描述
时间能力有限,今年难度明显增加,实在没时间去做

J. 拉箱子

在这里插入图片描述
时间能力有限,今年难度明显增加,实在没时间去做

个人总结

举报

相关推荐

0 条评论