温馨提示:这篇文章已超过469天没有更新,请注意相关的内容是否还可用!
摘要:第十四届蓝桥杯省赛Java(B组)真题解析已经出炉,经过测试平台验证的代码均准确无误。本次比赛涉及Java编程语言的多个知识点,包括算法设计、数据结构、面向对象编程等。解析过程详细阐述了题目的解题思路和方法,为参赛者提供了宝贵的参考经验。通过本次解析,参赛者可以更好地掌握Java编程技巧,提升编程能力。
J未完成,暂更。
目录
试题 A: 阶乘求和
【问题描述】
【答案提交】
【代码】:
试题 B: 幸运数字
【问题描述】
【答案提交】 答案为:215040
【思路解析】
【代码】
试题 C: 数组分割
【问题描述】
【输入格式】
【输出格式】
【样例输入】
【样例输出】
【样例说明】
【评测用例规模与约定】
【思路分析】
【代码】
试题 D: 矩形总面积
【问题描述】
【输入格式】
【输出格式】
【样例输入】
【样例输出】
【样例说明】
【评测用例规模与约定】
[思路解析】
【代码】
试题 E: 蜗牛
【问题描述】
【输入格式】
【输出格式】
【样例输入】
【样例输出】
【样例说明】
【评测用例规模与约定】
试题 F: 合并区域
【问题描述】
【输入格式】
【输出格式】
【样例输入】
【样例输出】
【样例说明】
试题 G: 买二赠一
【问题描述】
【输入格式】
【输出格式】
【样例输入】
【样例输出】
【样例说明】
【评测用例规模与约定】
【思路分析】
【代码实现】
试题 H: 合并石子
【问题描述】
【输入格式】
【输出格式】
【样例输入】
【样例输出】
【样例说明】
【评测用例规模与约定】
试题 I: 最大开支
【问题描述】
【输入格式】
【输出格式】
【样例输入】
【样例输出】
【样例说明】
【评测用例规模与约定】
【思路解析】
【代码实现】
试题 J: 魔法阵
【问题描述】
【输入格式】
【输出格式】
【样例输入 1】
【样例输出 1】
【样例输入 2】
【样例输出 2】
【样例说明】
【评测用例规模与约定】
试题 A: 阶乘求和
本题总分:5 分
【问题描述】
令 S = 1! + 2! + 3! + ... + 202320232023!,求 S 的末尾 9 位数字。 提示:答案首位不为 0。
【答案提交】
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
[思路解析]:
分析知,到45之后,每个数都含有这几个因子5 10 15 20 25 30 35 40,与偶数可以凑成0,40! 的末九位数就全都为 0 了,而且我们只求末九位数字,所以40!以后的阶乘对我们就没有影响了。 答案为:420940313
【代码】:
// 这里计算阶乘时使用lang存数据,以防数据过大。
/** * @ProjectName: study3 * @FileName: A * @author:HWJ * @Data: 2023/6/15 21:08 */ public class A { public static void main(String[] args) { long total = 0; for (int i = 1; i试题 C: 数组分割
时间限制: 1.0s 内存限制: 512.0MB 本题总分:10 分
【问题描述】
小蓝有一个长度为 N 的数组 A = [A0, A1, . . . , AN−1]。现在小蓝想要从 A 对 应的数组下标所构成的集合 I = {0, 1, 2, . . . , N − 1} 中找出一个子集 R1,那么 R1
在 I 中的补集为 R2。记 S 1 = ∑
r∈R1 Ar,S 2 = ∑
r∈R2 Ar,我们要求 S 1 和 S 2 均为 偶数,请问在这种情况下共有多少种不同的 R1。当 R1 或 R2 为空集时我们将
S 1 或 S 2 视为 0。
【输入格式】
第一行一个整数 T,表示有 T 组数据。 接下来输入 T 组数据,每组数据包含两行:第一行一个整数 N,表示数组A 的长度;第二行输入 N 个整数从左至右依次为 A0, A1, . . . , AN−1,相邻元素之 间用空格分隔。
【输出格式】
对于每组数据,输出一行,包含一个整数表示答案,答案可能会很大,你 需要将答案对 1000000007 进行取模后输出。
【样例输入】
2 |
2 |
6 6 |
2 |
1 6 |
【样例输出】
4
0
【样例说明】
对于第一组数据,答案为 4。(注意:大括号内的数字表示元素在数组中的 下标。)
R1 = {0}, R2 = {1};此时 S 1 = A0 = 6 为偶数, S 2 = A1 = 6 为偶数。
R1 = {1}, R2 = {0};此时 S 1 = A1 = 6 为偶数, S 2 = A0 = 6 为偶数。
R1 = {0, 1}, R2 = {};此时 S 1 = A0 + A1 = 12 为偶数, S 2 = 0 为偶数。
R1 = {}, R2 = {0, 1};此时 S 1 = 0 为偶数, S 2 = A0 + A1 = 12 为偶数。 对于第二组数据,无论怎么选择,都不满足条件,所以答案为 0。
【评测用例规模与约定】
对于 20% 的评测用例,1 ≤ N ≤ 10。 对于 40% 的评测用例,1 ≤ N ≤ 10 2。 对于 100% 的评测用例,1 ≤ T ≤ 10, 1 ≤ N ≤ 10 3 , 0 ≤ Ai ≤ 10 9。
【思路分析】
就是我们需要选择r1包括部分值,r2为剩余值,他们两个均为偶数,当整体和为奇数时,无论如何选择,总有一个为奇数,不满足情况,此组数据返回0,如果当整体和为偶数的时候,我们可以r1选择所有数,然后不断剔除一个任意偶数,或者任意两个奇数,此时就需要将数据按照偶数和奇数分类,计算偶数和奇数个数为偶数even个,奇数odd个,因为偶数和奇数的选择彼此独立,根据乘法法则,总方式为偶数方式*奇数方式。
即( +
+
+...... +
) * (
+
+
+ .... +
) % 1000000007.
由于取余对除法不满足分配律,但是算组合数会遇到除法,则我们需要使用费马小定理来解决这个问题。
原理如下:
【代码】
【费马小定理代码】
public static long qpow(long x, long n) { // 快速幂,求 x 的 n 次方 long res = 1; for (; n >= 1; n >>= 1, x = x * x % mod) { if ((n & 1) == 1) { res = res * x % mod; } } return res; } public static long combinatorial(int n, int r) { // 费小马定理 long res = 1; for (int i = 1; i y3 && y2 y3? (y2 - y1):(y2 - y3); } if (x == 0){ // 第一个矩形如果不在第二个矩形内部或者相交,考虑是否存在第二个矩形在第一个矩形内部的情况 if (x3 > x1 && x3 x1 && x4 x1? (x4 - x3):(x3 - x2); } } if (y == 0){ if (y3 > y1 && y3 y1 && y4 y1? (y4 - y3):(y3 - y2); } } return x*y; } }
[代码提交结果】
试题 E: 蜗牛
时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分
【问题描述】
这天,一只蜗牛来到了二维坐标系的原点。 在 x 轴上长有 n 根竹竿。它们平行于 y 轴,底部纵坐标为 0,横坐标分别 为 x1, x2, ..., xn。竹竿的高度均为无限高,宽度可忽略。蜗牛想要从原点走到第n 个竹竿的底部也就是坐标 (xn, 0)。它只能在 x 轴上或者竹竿上爬行,在 x 轴 上爬行速度为 1 单位每秒;由于受到引力影响,蜗牛在竹竿上向上和向下爬行 的速度分别为 0.7 单位每秒和 1.3 单位每秒。 为了快速到达目的地,它施展了魔法,在第 i 和 i + 1 根竹竿之间建立了传 送门(0
【输入格式】
输入共 1 + n 行,第一行为一个正整数 n; 第二行为 n 个正整数 x1, x2, . . . , xn; 后面 n − 1 行,每行两个正整数 ai , bi+1。
【输出格式】
输出共一行,一个浮点数表示答案(四舍五入保留两位小数)。
【样例输入】
3
1 10 11
1 1
2 1
【样例输出】
4.20
【样例说明】
蜗牛路线:
(0, 0) → (1, 0) → (1, 1) → (10, 1) → (10, 0) → (11, 0),花费时间为 1 + 1 /0.7 + 0 + 1 /1.3 + 1 ≈ 4.20
【评测用例规模与约定】
对于 20% 的数据,保证 n ≤ 15; 对于 100% 的数据,保证 n ≤10^5 ,ai , bi ≤ 10^4,xi ≤ 10^9。
【思路解析】
你从第一杆走到第3杆所用的方式,并不会对后面用时产生影响,走到下一杆至于当前杆的状态有关,所以每走一杆就找到走到这个地方的最短时间,然后不断往后动态规划,就找到了最优时间。
【代码】
import java.util.Scanner; /** * @ProjectName: study3 * @FileName: E * @author:HWJ * @Data: 2023/6/16 15:49 */ public class E { public static void main(String[] args) { Scanner input = new Scanner(System.in); int n = input.nextInt(); int[] num = new int[n+1]; int[][] ab = new int[n+1][2]; for (int i = 1; i
还没有评论,来说两句吧...