2022年第十三届蓝桥杯省赛JAVA B组 个人题解

星期计算

问题描述

已知今天是星期六,请问 2 0 22 20^{22} 2022天后是星期几?

注意用数字1到7表示星期一到星期日

思路:

  • 每个星期都是由7天循环一次
  • 所以只要是对经过多少天进行对7取余就可以得到结果
  • 当前日期再判断一下

import java.math.BigInteger;
public class Main {
    public static void main(String[] args) {
        BigInteger bigInteger=new BigInteger("20");
        BigInteger bigInteger1=bigInteger.pow(22);
        BigInteger x=bigInteger1.remainder(new BigInteger("7"));
        BigInteger y=x.add(new BigInteger("6"));
        System.out.println(y);
    }

答案:

7

问题描述

这天小明正在学数数

他突然发现有些正整数的形状像一座“山”,比如123565321145541,它们左右对称(回文)且数位上的数字先单调不减,后单调不增

小明数了很久也没有数完,他想让你告诉他在区间[2022, 2022222022]中有多少个数的形状像一座“山”

思路:

  • 用计数器来储存个数
  • 分开看,回文和单调性分开判断
  • 由于回文则只需判断一边的单调性
  • 如果都正确计数则加1
public class Main {
    public static void main(String[] args) {
        int num = 0;
        for (int i = 2022; i <= 2022222022; i++) {
            if (isPalindrome(i)&&isMonotonicity(i)) {
                num++;
            }
        }
        System.out.println(num);
    }
    // 判断是否回文
    public static boolean isPalindrome(int n) {
        char[] chars = String.valueOf(n).toCharArray();
        for (int i = 0; i < chars.length / 2; i++) {
            if (chars[i] != chars[chars.length - i - 1]) {
                return false;
            }
        }
        return true;
    }
    //判断是否单调
    public static boolean isMonotonicity(int n){
        char[] chars = String.valueOf(n).toCharArray();
        // 取中位数的长度
        for (int i = 1; i < chars.length / 2 + (chars.length % 2); i++) {
            if (chars[i] < chars[i-1]) {
                return false;
            }
        }
      return true;
    }
}

可能是方法太笨了,需要很长时间才运行出来,还以为eclipse出了问题

答案

3138

字符统计

问题描述

给定一个只包含大写字母的字符串S,请你输出其中出现次数最多的字母

如果有多个字母均出现了最多次,按字母表顺序依次输出所有这些字母

输入格式

一个只包含大写字母的字符串S

输出格式

若干个大写字母,代表答案

思路:

  • 用一个数组统计输入的字符串每个字符的次数
  • 遍历一遍找出最大次数
  • 遍历一遍输出次数与最大次数相同的字符
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String str = sc.next();
		int[] count = new int[26];
		for (int i = 0; i < str.length(); i++){
		// 统计输入的字符串每个字符的次数
			count[str.charAt(i) -'A']++;
		}
		// 最大次数
		int max = 0;
		for (int i = 0; i < count.length; i++) {
			if (count[i] > max) {
				max = count[i];
			}
		}
		for (int i = 0; i < count.length; i++) {
		// 输出次数与最大次数相同的字符
			if (count[i] == max) {
				System.out.print((char) (i + 'A'));
			}
		}
	}
}

最少刷题数

问题描述

小蓝老师教的编程课有N名学生,编号依次是1 . . . N
i号学生这学期刷题的数量是Ai

对于每一名学生,请你计算他至少还要再刷多少道题,才能使得全班刷题比他多的学生数不超过刷题比他少的学生数

输入格式

第一行包含一个正整数 N
第二行包含N个整数:A1, A2, A3, . . . , AN

输出格式

输出N个整数,依次表示第1 . . . N号学生分别至少还要再刷多少道题

思路:

  • 输入的刷题数进行排序
  • 进行分情况考虑
  • 奇数情况下,超过中间值才能满足全班刷题比他多的学生数不超过刷题比他少的学生数
  • 偶数情况下需要等于中间偏大的值就可以满足条件
import java.util.Arrays;
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner scan = new Scanner(System.in);
		int n = scan.nextInt();
		int[] nums = new int[n];
		int[] count = new int[n];
		for (int i = 0; i < nums.length; i++) {
		// 输入的一个数组,并把这个数组复制下来
			nums[i] = scan.nextInt();
			count[i] = nums[i];
		}
		// 个数组排一下序方便找到较中间的那个数
		Arrays.sort(count);
		// 找到中间的索引
		int index = 0;
		// 分情况讨论值
		if (n % 2 == 0) {
			index = n / 2 + 1;
		} else {
			index = n / 2;
		}
		// 找到中间值
		int middle = count[index];
		for (int i = 0; i < n; i++) {
		// 判断得到最终结果
			if (nums[i] < middle) {
				System.out.print(middle - nums[i] + 1);
				System.out.print(" ");
			} else {
				System.out.print(0);
				System.out.print(" ");
			}
		}

		scan.close();
	}

}

求阶乘

问题描述

满足N!的末尾恰好有K0的最小的N是多少?
如果这样的N不存在输出−1

输入格式

一个整数 K

输出格式

一个整数代表答案

思路

  • 只有2*5两个质因数可以组合10,2的数量大于5的数量
1 5   2 10   3 15   4 20    5 -1 
6 25  7 30   8 35   9 40    10 45 11 -1
......
  • 所以6个进行一次循环,对k%6获取无效的值的次数
  • k的值为无效的值的次数和5的倍数之和
  • (k-5)%6==0则直接返回-1
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String k = sc.next();
		// 得到k的实际值
		BigInteger bigK = new BigInteger(k);
		// k%6获取无效的值的次数
		BigInteger n = bigK.divide(BigInteger.valueOf(6L));
		// (k-5)%6==0则直接返回-1
		if (bigK.subtract(BigInteger.valueOf(5L)).remainder(BigInteger.valueOf(6L)).toString().equals("0")) {
			System.out.println(-1);
		} else {
	   // 	k的值为无效的值的次数和5的倍数之和,得到最终的值	
            System.out.println(bigK.subtract(n).multiply(BigInteger.valueOf(5L)));
		}

	}
}

最大子矩阵

问题描述

小明有一个大小为N × M的矩阵,可以理解为一个NM列的二维数组

我们定义一个矩阵m的稳定度f(m)f(m) = max(m) − min(m),其中max(m)表示矩阵m中的最大值,min(m)表示矩阵m中的最小值。现在小明想要从这
个矩阵中找到一个稳定度不大于limit的子矩阵,同时他还希望这个子矩阵的面积越大越好

输入格式
第一行输入两个整数N,M,表示矩阵的大小
接下来N行,每行输入M个整数,表示这个矩阵
最后一行输入一个整数limit,表示限制

输出格式

输出一个整数,分别表示小明选择的子矩阵的最大面积

数组切分

问题描述

已知一个长度为N的数组A1, A2, A3, ...AN恰好是1 ∼ N的一个排列。现在要求你将A数组切分成若干个 (最少一个,最多N个) 连续的子数组,并且每个子数组中包含的整数恰好可以组成一段连续的自然数

输入格式

第一行包含一个整数N。第二行包含N个整数,代表A数组

输出格式

输出一个整数表示答案。由于答案可能很大,所以输出其对 1000000007取模后的值

回忆迷宫

问题描述

爱丽丝刚从一处地下迷宫中探险归来,你能根据她对于自己行动路径的回忆,帮她画出迷宫地图吗?
迷宫地图是基于二维网格的。爱丽丝会告诉你一系列她在迷宫中的移动步骤,每个移动步骤可能是上下左右四个方向中的一种,表示爱丽丝往这个方向走了一格。你需要根据这些移动步骤给出一个迷宫地图,并满足以下条件:
1、爱丽丝能在迷宫内的某个空地开始,顺利的走完她回忆的所有移动步骤。
2、迷宫内不存在爱丽丝没有走过的空地。
3、迷宫是封闭的,即可通过墙分隔迷宫内与迷宫外。任意方向的无穷远处视为迷宫外,所有不与迷宫外联通的空地都视为是迷宫内。(迷宫地图为四联通,即只有上下左右视为联通)
4、在满足前面三点的前提下,迷宫的墙的数量要尽可能少。

输入格式

第一行一个正整数 N,表示爱丽丝回忆的步骤数量接下来一行 N 个英文字符,仅包含 UDLR 四种字符,分别表示上(Up)、下(Down)、左(Left)、右(Right)

输出格式

请通过字符画的形式输出迷宫地图。迷宫地图可能包含许多行,用字符 ‘’表示墙,用 ‘ ’(空格)表示非墙。
你的输出需要保证以下条件:
1、至少有一行第一个字符为 ‘

2、第一行至少有一个字符为 ‘
3、每一行的最后一个字符为 ‘

4、最后一行至少有一个字符为 ‘*’

红绿灯

问题描述

爱丽丝要开车去上班,上班的路上有许多红绿灯,这让爱丽丝很难过。为
了上班不迟到,她给自己的车安装了氮气喷射装置。现在她想知道自己上班最
短需要多少时间。
爱丽丝的车最高速度是 1V 米每秒,并且经过改装后,可以瞬间加速到小于
等于最高速的任意速度,也可以瞬间停止。
爱丽丝家离公司有N米远,路上有M个红绿灯,第i个红绿灯位于离爱
丽丝家Ai米远的位置,绿灯持续Bi秒,红灯持续C 秒。在初始时(爱丽丝开始计时的瞬间),所有红绿灯都恰好从红灯变为绿灯。如果爱丽丝在绿灯变红的瞬间到达红绿灯,她会停下车等红灯,因为她是遵纪守法的好市民。氮气喷射装置可以让爱丽丝的车瞬间加速到超光速(且不受相对论效应的
影响!),达到瞬移的效果,但是爱丽丝是遵纪守法的好市民,在每个红绿灯前她都会停下氮气喷射,即使是绿灯,因为红绿灯处有斑马线,而使用氮气喷射装置通过斑马线是违法的。此外,氮气喷射装置不能连续启动,需要一定时间
的冷却,表现为通过K个红绿灯后才能再次使用。(也就是说,如果 K = 1,就能一直使用啦!)初始时,氮气喷射装置处于可用状态

输入格式

第一行四个正整数N、M、K、V,含义如题面所述。
接下来M行,每行三个正整数Ai、Bi、Ci,含义如题面所述

输出格式

输出一个正整数 T,表示爱丽丝到达公司最短需要多少秒

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值