2021蓝桥杯JavaB组国赛

【2021蓝桥杯JavaB组国赛】做题记录

试题 A: 整数范围

本题总分:5 分
【问题描述】
用 8 位二进制(一个字节)来表示一个非负整数,表示的最小值是 0,则一般能表示的最大值是多少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

分析
二进制1111,1111的十进制是2 ^ 8 - 1 = 255

answer:255

code
Math.pow(2,8) 是 求 2 的 8次方 返回值是 double 然后转 int

public class JB21G_01 {

	public static void main(String[] args) {
		System.out.println((int)Math.pow(2,8) - 1);//255
	}
}

试题 B: 纯质数

本题总分:5 分
【问题描述】
如果一个正整数只有 1 和它本身两个约数,则称为一个质数(又称素数)。
前几个质数是:2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, ···。
如果一个质数的所有十进制数位都是质数,我们称它为纯质数。例如:2, 3, 5, 7, 23, 37 都是纯质数,而 11, 13, 17, 19, 29, 31 不是纯质数。当然 1, 4, 35
也不是纯质数。
请问,在 1 到 20210605 中,有多少个纯质数?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

分析:
暴力求解:i 从 1 到 20210605 遍历一遍,先检查一下 i 本身是否是质数,再把 i的每一位数取出 再判断每一位数是否是质数,都满足则 ans++

answer:1903

code:

public class JB21G_02纯质数 {

	public static void main(String[] args) {
		int ans = 0;
//		System.out.println(fenJie(54321,3));
		int max = 20210605;
//		20210605
		for (int i = 1; i <= max; i++) {
			boolean flag = true;
			String str = "" + i;
			int len = str.length();
			if (!prime(i)) {
				flag = false;
			}
			for (int j = 1; j <= str.length(); j++) {
				if (!prime(fenJie(i,j))) {
					flag = false;
				}
			}
			if (flag) {
//				System.out.println("纯质数==" + i);
//				2, 3, 5, 7, 23, 37
				ans++;
				System.out.println(ans);
			}
		}
//		最后一个纯质数==7777753
		System.out.println(ans);//1903
	}
//	n的第k位
	public static int fenJie(int n,int k) {
		return n % (int)Math.pow(10, k) / (int)Math.pow(10, k - 1);
	}
//	n是否是质数
	public static boolean prime(int n) {
		if (n < 2) {
			return false;
		}
		for (int i = 2; i <= (int)Math.sqrt(n); i++) {
			if (n % i == 0) {
				return false;
			}
		}
		return true;
	}
}

试题 C: 完全日期

本题总分:10 分
【问题描述】
如果一个日期中年月日的各位数字之和是完全平方数,则称为一个完全日期。
例如:2021 年 6 月 5 日的各位数字之和为 2 + 0 + 2 + 1 + 6 + 5 = 16,而
16 是一个完全平方数,它是 4 的平方。所以 2021 年 6 月 5 日是一个完全日期。
例如:2021 年 6 月 23 日的各位数字之和为 2 + 0 + 2 + 1 + 6 + 2 + 3 = 16,
是一个完全平方数。所以 2021 年 6 月 23 日也是一个完全日期。
请问,从 2001 年 1 月 1 日到 2021 年 12 月 31 日中,一共有多少个完全日
期?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

分析:
用一个整数表示 日期 从 20010101 到 20211231 遍历
检查是否是合法的日期 和 各位数之和是否是完全平方数

answer:977

code:

public static void main(String[] args) {
		int ans = 0;
		int end = 20211231;
//		20211231
		for (int i = 20010101; i <= end; i++) {
			if (isCanlanda(i)) {
				int sum = 0;
//				求和
				String str = "" + i;
				for (int j = 1; j <= str.length(); j++) {
					int sub = i % (int) Math.pow(10, j) / (int) Math.pow(10, j - 1);
					sum += sub;
				}
//				System.out.println("sum=" + sum);
				if (sum == (int) Math.sqrt(sum) * ((int) Math.sqrt(sum))) {
					System.out.println("i= " + i);
					System.out.println("sum=" + sum);
					ans++;
					System.out.println("ans:" + ans);//977
				}
			}
		}
	}

	public static boolean isRun(int year) {
//		System.out.println("judge==" + year);
		if (year % 400 == 0 || (year % 4 == 0 && year % 100 != 0)) {
//			System.out.println("是闰年" + year);
			return true;
		}
		return false;
	}

	public static boolean isCanlanda(int n) {
		int year = n % (int) Math.pow(10, 8) / (int) Math.pow(10, 4);
		int mouth = n % (int) Math.pow(10, 4) / (int) Math.pow(10, 2);
		int day = n % (int) Math.pow(10, 2);

//		System.out.println("  " + year + "," + mouth + ", " + day);
		if (!(mouth > 0 && mouth <= 12 && day > 0 && day <= 31)) {
//			System.out.println("!(mouth > 0 && mouth <= 12 && day <= 31)");
			return false;
		}

		if (mouth == 4 || mouth == 6 || mouth == 9 || mouth == 11) {
			if (day > 30) {
//				System.out.println("day > 30");
				return false;
			}
		}
		if (mouth == 2) {
			if (isRun(year)) {
				if (day > 29) {
//					System.out.println("day > 29");
					return false;
				}
			} else {
				if (day > 28) {
					return false;
				}
			}
		}
//		System.out.println(" he " + year + "," + mouth + ", " + day);
		return true;
	}

试题 D: 最小权值

本题总分:10 分
【问题描述】
对于一棵有根二叉树 T,小蓝定义这棵树中结点的权值 W(T) 如下:
空子树的权值为 0。
如果一个结点 v 有左子树 L, 右子树 R,分别有 C(L) 和 C® 个结点,则
W(v) = 1 + 2W(L) + 3W® + (C(L))
2 C®。
树的权值定义为树的根结点的权值。
小蓝想知道,对于一棵有 2021 个结点的二叉树,树的权值最小可能是多
少?
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一
个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

分析:不会做

code:

试题 E: 大写

时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分
【问题描述】
给定一个只包含大写字母和小写字母的字符串,请将其中所有的小写字母
转换成大写字母后将字符串输出。
【输入格式】
输入一行包含一个字符串。
【输出格式】
输出转换成大写后的字符串。
【样例输入 1】
LanQiao
【样例输出 1】
LANQIAO
【评测用例规模与约定】
对于所有评测用例,字符串的长度不超过 100。

package javaB2021G;

import java.util.Scanner;

public class JB21G_05大写 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			String str = sc.next();
//		小写变大写
//			写法1
			char[] ch = str.toCharArray();
			for (int i = 0; i < ch.length; i++) {
				if (ch[i] >= 'a' && ch[i] <= 'z') {
					ch[i] = (char) (ch[i] - 32);
				}
			}
			for (int i = 0; i < ch.length; i++) {
				System.out.print(ch[i]);
			}
			System.out.println();
//			写法2
//			System.out.print(str.toUpperCase());
		}
	}
}


试题 F: 123

时间限制: 5.0s 内存限制: 512.0MB 本题总分:15 分
【问题描述】
小蓝发现了一个有趣的数列,这个数列的前几项如下:
1, 1, 2, 1, 2, 3, 1, 2, 3, 4, …
小蓝发现,这个数列前 1 项是整数 1,接下来 2 项是整数 1 至 2,接下来
3 项是整数 1 至 3,接下来 4 项是整数 1 至 4,依次类推。
小蓝想知道,这个数列中,连续一段的和是多少。
【输入格式】
输入的第一行包含一个整数 T,表示询问的个数。
接下来 T 行,每行包含一组询问,其中第 i 行包含两个整数 li 和 ri,表示
询问数列中第 li 个数到第 ri 个数的和。
【输出格式】
输出 T 行,每行包含一个整数表示对应询问的答案。
【样例输入】

3
1 1
1 3
5 8

【样例输出】
1
4
8

【评测用例规模与约定】
对于 10% 的评测用例,1 ≤ T ≤ 30, 1 ≤ li ≤ ri ≤ 100。
对于 20% 的评测用例,1 ≤ T ≤ 100, 1 ≤ li ≤ ri ≤ 1000。
对于 40% 的评测用例,1 ≤ T ≤ 1000, 1 ≤ li ≤ ri ≤ 106。
对于 70% 的评测用例,1 ≤ T ≤ 10000, 1 ≤ li ≤ ri ≤ 109。
对于 80% 的评测用例,1 ≤ T ≤ 1000, 1 ≤ li ≤ ri ≤ 1012。
对于 90% 的评测用例,1 ≤ T ≤ 10000, 1 ≤ li ≤ ri ≤ 1012。
对于所有评测用例,1 ≤ T ≤ 100000, 1 ≤ li ≤ ri ≤ 1012。

试题 G: 和与乘积

时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分
【问题描述】
给定一个数列 A = (a1, a2, · · · , an),问有多少个区间 [L, R] 满足区间内元素
的乘积等于他们的和,即 aL · aL+1 · · · aR = aL + aL+1 + · · · + aR 。
【输入格式】
输入第一行包含一个整数 n,表示数列的长度。
第二行包含 n 个整数,依次表示数列中的数 a1, a2, · · · , an。
【输出格式】
输出仅一行,包含一个整数表示满足如上条件的区间的个数。
【样例输入】

4
1 3 2 2

【样例输出】
6
【样例解释】
符合条件的区间为 [1, 1], [1, 3], [2, 2], [3, 3], [3, 4], [4, 4]。
【评测用例规模与约定】
对于 20% 的评测用例,n, m ≤ 3000;
对于 50% 的评测用例,n, m ≤ 20000;
对于所有评测用例,1 ≤ n, m ≤ 200000, 1 ≤ ai ≤ 200000。

public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while (sc.hasNext()) {
			int ans = 0;
			int n = sc.nextInt();
			int[] a = new int[n];
			for (int i = 0; i < a.length; i++) {
				a[i] = sc.nextInt();
			}
			for (int left = 0; left < a.length; left++) {
				for (int right = left; right < a.length; right++) {
					if (is(a, left, right)) {
						ans++;
					}
				}
			}
			System.out.println(ans);
		}
		
	}

	public static boolean is(int[] a, int left, int right) {
		BigInteger sum = BigInteger.ZERO;
		for (int i = left; i <= right; i++) {
			sum = sum.add(BigInteger.valueOf(a[i]));
		}
		BigInteger mul = BigInteger.ONE;
		for (int i = left; i <= right; i++) {
			mul = mul.multiply(BigInteger.valueOf(a[i]));
		}
		return (sum.equals(mul))? true :false;
	}

试题 H: 巧克力

时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分
【问题描述】
小蓝很喜欢吃巧克力,他每天都要吃一块巧克力。
一天小蓝到超市想买一些巧克力。超市的货架上有很多种巧克力,每种巧
克力有自己的价格、数量和剩余的保质期天数,小蓝只吃没过保质期的巧克力,
请问小蓝最少花多少钱能买到让自己吃 x 天的巧克力。
【输入格式】
输入的第一行包含两个整数 x, n,分别表示需要吃巧克力的天数和巧克力
的种类数。
接下来 n 行描述货架上的巧克力,其中第 i 行包含三个整数 ai, bi, ci,表示
第 i 种巧克力的单价为 ai,保质期还剩 bi 天(从现在开始的 bi 天可以吃),数量为 ci。
【输出格式】
输出一个整数表示小蓝的最小花费。如果不存在让小蓝吃 x 天的购买方案,
输出 −1。
【样例输入】

10 3
1 6 5
2 7 3
3 10 10

【样例输出】
18

【样例说明】
一种最佳的方案是第 1 种买 5 块,第 2 种买 2 块,第 3 种买 3 块。前 5 天
吃第 1 种,第 6、7 天吃第 2 种,第 8 至 10 天吃第 3 种。
【评测用例规模与约定】
对于 30% 的评测用例,n, x ≤ 1000。
对于所有评测用例,1 ≤ n, x ≤ 100000,1 ≤ ai , bi , ci ≤ 10^9。

分析
好像要用动态规划做,不会

试题 I: 翻转括号序列

时间限制: 10.0s 内存限制: 768.0MB 本题总分:25 分
【问题描述】
给定一个长度为 n 的括号序列,要求支持两种操作:

  1. 将 [Li , Ri ] 区间内(序列中的第 Li 个字符到第 Ri 个字符)
    的括号全部翻转(左括号变成右括号,右括号变成左括号)。
  2. 求出以 Li 为左端点时,最长的合法括号序列对应的 Ri (即找出最大的
    Ri 使 [Li , Ri] 是一个合法括号序列)。
    【输入格式】
    输入的第一行包含两个整数 n, m,分别表示括号序列长度和操作次数。
    第二行包含给定的括号序列,括号序列中只包含左括号和右括号。
    接下来 m 行,每行描述一个操作。如果该行为 “1 Li Ri”,表示第一种操作, 区间为 [Li, Ri] ;
    如果该行为 “2 Li” 表示第二种操作,左端点为 Li。
    【输出格式】
    对于每个第二种操作,输出一行,表示对应的 Ri。如果不存在这样的 Ri, 请输出 0。
    【样例输入】
7 5
((())()
2 3
2 2
1 3 5
2 3
2 1

【样例输出】
4
7
0
0
【评测用例规模与约定】
对于 20% 的评测用例,n, m ≤ 5000;
对于 40% 的评测用例,n, m ≤ 30000;
对于 60% 的评测用例,n, m ≤ 100000;
对于所有评测用例,1 ≤ n ≤ 10^6 , 1 ≤ m ≤ 2 × 10^5。

分析:

试题 J: 异或三角

时间限制: 5.0s 内存限制: 512.0MB 本题总分:25 分
【问题描述】
给定 T 个数 n1, n2, · · · , nT,对每个 ni 请求出有多少组 a, b, c 满足:

  1. 1 ≤ a, b, c ≤ ni;
  2. a ⊕ b ⊕ c = 0,其中 ⊕ 表示二进制按位异或;
  3. 长度为 a, b, c 的三条边能组成一个三角形。
    【输入格式】
    输入的第一行包含一个整数 T。
    接下来 T 行每行一个整数,分别表示 n1, n2, · · · , nT。
    【输出格式】
    输出 T 行,每行包含一个整数,表示对应的答案。
    【样例输入】
2
6 114514

【评测用例规模与约定】
对于 10% 的评测用例,T = 1, 1 ≤ ni ≤ 200;
对于 20% 的评测用例,T = 1, 1 ≤ ni ≤ 2000;
对于 50% 的评测用例,T = 1, 1 ≤ ni ≤ 2^20;
对于 60% 的评测用例,1 ≤ T ≤ 100000, 1 ≤ ni ≤ 2^20;
对于所有评测用例,1 ≤ T ≤ 100000, 1 ≤ ni ≤ 2^30。
分析:
看到测试用例 很大所以用 BigInteger ,
暴力法:
1 ≤ a, b, c ≤ ni;
在for循环的时候控制
2. a ⊕ b ⊕ c = 0,其中 ⊕ 表示二进制按位异或;
BigInteger有一个求异或运算的方法 a.xor(BigInteger b)
3. 长度为 a, b, c 的三条边能组成一个三角形。
构成三角形的条件:任意两边之和大于第三边

code (小数据可以测,大数会超时)

public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int T = sc.nextInt();
		for (int i = 0; i < T; i++) {
			BigInteger n = sc.nextBigInteger();
			BigInteger ans = BigInteger.ZERO;
//			case 1
			for (BigInteger a = BigInteger.ONE; a.compareTo(n) != 1; a = a.add(BigInteger.ONE)) {
				for (BigInteger b = BigInteger.ONE; b.compareTo(n) != 1; b = b.add(BigInteger.ONE)) {
					for (BigInteger c = BigInteger.ONE; c.compareTo(n) != 1; c = c.add(BigInteger.ONE)) {
//						ans = is(a,b,c,n) ? ans.add(BigInteger.ONE) : ans;
						if (is(a, b, c, n)) {
							System.out.printf("a,b,c: %d  %d  %d\n",a,b,c);
							ans = ans.add(BigInteger.ONE);
						}
					}
				}
			}
			System.out.println(ans);
		}
	}

	public static boolean is(BigInteger a, BigInteger b, BigInteger c, BigInteger n) {
//		case 2 异或运算 a ^ b ^ c == 0
		BigInteger xor = a.xor(b).xor(c);
		if (!xor.equals(BigInteger.ZERO)) {
			return false;
		}
//		case 3 任意两边之和大于第三边
		if (!(
				(c.compareTo(a.add(b))) == -1
				&& (b.compareTo(c.add(a).abs())) == -1
				&& (a.compareTo(c.add(b))) == -1
		 )) {
			return false;
		}
		return true;
	}

小结

做了1,2,3,5,7题,大部分都是直接暴力解。

  1. 进制问题
  2. 判断素数 ,提取某个数的某位数
  3. 判断闰年,日期是否存在等
  4. 二叉树节点(未知)
  5. 小写字母转大写字母
  6. 等差数列求前n项和
  7. 纯暴力用BigInteger 使用 BigInteger 自带的加减乘除
  8. 吃巧克力:动态规划(目测)
  9. 模拟 字符操作 合法括号的匹配
    10.异或运算 使用 BigInteger 自带的异或运算 a.xor(b) ,构成三角形的条件:任意两边之和大于第三边

第10题只能跑部分的测试样例,写的代码会超时,其他几道题还没有做出来,还需要加把劲,加油!
后面有时间再更新。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值