2025 年蓝桥杯 Java B 组真题解析分享
今年是我第二次参加蓝桥杯软件类Java B组的比赛,虽然赛前做了不少准备,但真正坐在考场上时,还是有种熟悉又紧张的感觉。蓝桥杯的题目一向以“基础+创新”著称,今年也不例外,每道题都考验着我们对算法的理解、代码实现能力和临场应变的综合实力。
这篇博客我想记录一下我对今年Java B组算法题的整体思路、解法细节、以及做题过程中遇到的一些坑和收获。希望对正在备赛或者想了解蓝桥杯题型的同学有帮助,也算是给自己的一个总结和回顾。
洛谷上整理有今年的Java B组原题,大家可以点击题目名称跳转到对应的链接查看原题或者进行测试。
1. 题目一:逃离立方塔
题目描述
小蓝一觉醒来,发现自己被困在一座高耸的塔中。这座塔共有 2025 2025 2025 层,每一层都刻有一个数字的立方值,从底层的 1 3 , 2 3 , 3 3 , … 1^3,2^3,3^3,\dots 13,23,33,… 一直到顶层的 202 5 3 2025^3 20253,层层叠叠,直入云霄。塔顶有一扇门,门旁刻着一行字:“若想离开此塔,需找出这些立方数中个位数字为 3 3 3 的数的个数。”
小蓝非常着急,因为他需要尽快离开这座塔,去参加即将到来的蓝桥杯比赛。时间紧迫,请你帮助他解答这个问题。
输入格式
无
输出格式
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只需要编写一个程序输出这个整数,输出多余的内容将无法得分。
解题思路
我们只需要统计从 1 到 2025 的所有整数的立方值中,个位数字是 3 的数量。由于立方值可能超出 int 范围,需使用 long 类型来避免溢出。
此外,我们还可以通过观察立方数的个位规律进行优化。只有个位为 7 的数字,其立方的个位才为 3(因为 7 3 = 343 7^3 = 343 73=343,个位是 3),因此我们也可以仅统计个位为 7 的数字的个数(这种思路就不写代码了,实际上可以直接看出来是有202个)。
代码实现
public class Main {public static void main(String[] args) {int count = 0;for (int i = 1; i <= 2025; i++) {long cube = (long) i * i * i;if (cube % 10 == 3) {count++;}}System.out.println(count);}
}
2. 题目二:消失的蓝宝
题目描述
“蓝宝又不见了!” 2025 年 4 月 12 日,蓝桥杯吉祥物 “蓝宝” 在省赛前夕突然失踪。小蓝翻阅了蓝宝的活动记录,发现它的出现时间似乎与蓝桥杯的两个重要日期密切相关:
- 第十六届省赛日期 20250412 20250412 20250412。
- 第十五届省赛日期 20240413 20240413 20240413。
经过分析,小蓝推测蓝宝的下一次出现时间 N N N 满足以下条件:
- N + 20250412 N + 20250412 N+20250412 能被 20240413 20240413 20240413 整除。
- N + 20240413 N + 20240413 N+20240413 能被 20250412 20250412 20250412 整除。
现在,请你帮小蓝找出满足条件的最小正整数 N N N,预测蓝宝的下一次出现时间。
输入格式
无
输出格式
这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只需要编写一个程序输出这个整数,输出多余的内容将无法得分。
解题思路
将两个条件表示为:
-
N ≡ -20250412 (mod 20240413)
-
N ≡ -20240413 (mod 20250412)
这是典型的中国剩余定理求解同余方程组问题。由于两个模数互质,可以使用暴力枚举从最小满足第一个同余的数开始,每次加上 20240413,直到也满足第二个同余条件为止。
代码实现
public class Main {public static void main(String[] args) {long a = 20250412;long b = 20240413;// 求最小满足 (N + a) % b == 0long n = b - (a % b);while ((n + b) % a != 0) {n += b;}System.out.println(n);}
}
3. 题目三:电池分组
题目描述
研究员小蓝受到实验室主任的指示,需要对实验室新研发的 N N N 个新型能量电池进行分组实验。这 N N N 个能量电池的能量值分别用 A 1 , A 2 , … , A N A_1, A_2, \dots , A_N A1,A2,…,AN 表示,每个能量值都是一个整数。为了保证实验的安全性,小蓝需要将这 N N N 个能量电池分成两组,使得这两组能量电池的能量值异或和相等。
能量值的异或和计算方法如下:对于一个集合 S S S,其异或和等于集合中所有元素的按位异或结果。例如,集合 { 1 , 2 , 3 } \{1, 2, 3\} {1,2,3} 的异或和为 1 ⊕ 2 ⊕ 3 = 0 1 \oplus 2 \oplus 3 = 0 1⊕2⊕3=0,其中 ⊕ \oplus ⊕ 表示异或运算。
现在,小蓝想知道,这 N N N 个能量电池能否分成两组,使得这两组能量电池的能量值异或和相等。注意,每组至少包含一个能量电池。
请你帮帮他!
输入格式
输入的第一行包含一个整数 T T T,表示测试用例的数量。
每个测试用例占两行:
- 第一行包含一个整数 N N N,表示能量电池的数量。
- 第二行包含 N N N 个整数 A 1 , A 2 , … , A N A_1, A_2, \dots , A_N A1,A2,…,AN,表示每个能量电池的能量值。
输出格式
对于每个测试用例,输出一行。如果可以将能量电池分成两组,使得这两组能量电池的能量值异或和相等,则输出 YES
;否则,输出 NO
。
输入输出样例 #1
输入 #1
2
3
1 2 3
4
1 2 3 4
输出 #1
YES
NO
说明/提示
评测用例规模与约定
- 对于 30 % 30\% 30% 的评测用例, 1 ≤ T ≤ 10 1 \leq T \leq 10 1≤T≤10, 2 ≤ N ≤ 100 2 \leq N \leq 100 2≤N≤100, 1 ≤ A i ≤ 1 0 3 1 \leq A_i \leq 10^3 1≤Ai≤103。
- 对于 100 % 100\% 100% 的评测用例, 1 ≤ T ≤ 1 0 3 1 \leq T \leq 10^3 1≤T≤103, 2 ≤ N ≤ 1 0 3 2 \leq N \leq 10^3 2≤N≤103, 1 ≤ A i ≤ 1 0 5 1 \leq A_i \leq 10^5 1≤Ai≤105。
异或运算特性
-
异或是一个非常特殊的运算,它满足以下性质:
-
任何数和 0 异或仍为该数: x ⊕ 0 = x x \oplus 0 = x x⊕0=x
-
相同的两个数异或结果为 0: x ⊕ x = 0 x \oplus x = 0 x⊕x=0
-
异或运算是可交换的: x ⊕ y = y ⊕ x x \oplus y = y \oplus x x⊕y=y⊕x
-
异或运算是结合的: ( x ⊕ y ) ⊕ z = x ⊕ ( y ⊕ z ) (x \oplus y) \oplus z = x \oplus (y \oplus z) (x⊕y)⊕z=x⊕(y⊕z)
-
-
如果将一组数分成两组,使得两组的异或和相等,实际上就是要求整个数组的异或和为 0,因为:
- 如果整个数组的异或和是 S S S,假设可以分成两组使得两组异或和相等,则这些组的异或和都应该是 S / 2 S/2 S/2,但是如果 S S S 本身不为 0,是无法做到的。
因此,若数组的异或和是 0,则说明可以将其分成两组使得这两组的异或和相等,否则不可能。
解题思路
-
对于每个测试用例,首先计算所有能量电池的异或和。
-
如果异或和为 0,则输出 “YES”,表示可以分成两组;如果异或和不为 0,则输出 “NO”。
##代码实现
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int T = sc.nextInt(); // 测试用例的数量while (T-- > 0) {int N = sc.nextInt(); // 电池的数量int xorSum = 0; // 用来存储异或和for (int i = 0; i < N; i++) {xorSum ^= sc.nextInt(); // 计算异或和}// 如果异或和为0,则可以分成两组,否则不可以if (xorSum == 0) {System.out.println("YES");} else {System.out.println("NO");}}sc.close();}
}
4. 题目四:魔法科考试
题目描述
小明正在参加魔法科的期末考试,考生需要根据给定的口诀组合出有效的魔法。其中,老师给定了 n n n 个上半部分口诀 a 1 , a 2 , … , a n a_1, a_2, \dots , a_n a1,a2,…,an 和 m m m 个下半部分口诀 b 1 , b 2 , … , b m b_1, b_2, \dots , b_m b1,b2,…,bm,均用整数表示。完整的口诀包含一个上半部分口诀和一个下半部分口诀,当选用两个口诀 a i a_i ai 和 b j b_j bj,将组合出完整口诀 S = a i + b j S = a_i + b_j S=ai+bj。
当 S S S 满足 S ≤ n + m S \leq n + m S≤n+m 且 S S S 为质数时,魔法是有效的。魔法的种类只和 S S S 的大小有关。如果每个上半部分口诀和每个下半部分口诀在不同的组合中可以重复使用,小明想知道一共可能组合出多少种不同的有效魔法?
输入格式
输入共三行。
- 第一行为两个正整数 n , m n, m n,m。
- 第二行为 n n n 个由空格分开的正整数 a 1 , a 2 , … , a n a_1, a_2, \dots , a_n a1,a2,…,an。
- 第三行为 m m m 个由空格分开的正整数 b 1 , b 2 , … , b m b_1, b_2, \dots , b_m b1,b2,…,bm。
输出格式
输出共 1 1 1 行,一个整数表示答案。
输入输出样例 #1
输入 #1
3 4
2 3 10
3 4 5 1
输出 #1
3
说明/提示
样例说明
可以组合出 3 , 5 , 7 3,5,7 3,5,7 这三个有效魔法。
评测用例规模与约定
- 对于 20 % 20\% 20% 的评测用例, n , m ≤ 200 n, m \leq 200 n,m≤200。
- 对于 60 % 60\% 60% 的评测用例, n , m ≤ 2000 n, m \leq 2000 n,m≤2000。
- 对于 100 % 100\% 100% 的评测用例, 1 ≤ n , m ≤ 20000 1\leq n, m \leq 20000 1≤n,m≤20000, 1 ≤ a i , b i ≤ 20000 1\leq a_i, b_i \leq 20000 1≤ai,bi≤20000。
解题思路
我们可以通过以下步骤来解决问题:
-
计算可能的 S S S 值:对于每对 a i a_i ai 和 b j b_j bj,计算出 S = a i + b j S = a_i + b_j S=ai+bj。并且我们需要检查这个 S S S 是否满足:
-
S ≤ n + m S \leq n + m S≤n+m
-
S S S 是质数
-
-
使用质数筛选:由于我们需要对多个数进行质数判断,可以使用 埃拉托斯特尼筛法 来预处理所有可能的数(从 1 到 n + m n + m n+m)的质数标记。
-
去重:我们需要记录每个组合出的有效魔法,即每个满足条件的质数值。为了去重,可以使用集合(set)。
代码实现
import java.util.HashSet;
import java.util.Scanner;
import java.util.Set;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);// 读取输入int n = sc.nextInt();int m = sc.nextInt();int[] a = new int[n];int[] b = new int[m];for (int i = 0; i < n; i++) {a[i] = sc.nextInt();}for (int i = 0; i < m; i++) {b[i] = sc.nextInt();}// 计算最大可能的 Sint maxSum = n + m;// 使用埃拉托斯特尼筛法计算质数boolean[] isPrime = new boolean[maxSum + 1];isPrime[0] = isPrime[1] = false; // 0 和 1 不是质数for (int i = 2; i <= maxSum; i++) {isPrime[i] = true;}// 筛选出质数for (int i = 2; i * i <= maxSum; i++) {if (isPrime[i]) {for (int j = i * i; j <= maxSum; j += i) {isPrime[j] = false;}}}// 使用集合去重存储有效魔法的质数Set<Integer> validPrimes = new HashSet<>();// 遍历所有组合计算 Sfor (int i = 0; i < n; i++) {for (int j = 0; j < m; j++) {int sum = a[i] + b[j];if (sum <= maxSum && isPrime[sum]) {validPrimes.add(sum);}}}// 输出有效魔法的数量System.out.println(validPrimes.size());sc.close();}
}
5. 题目五:爆破
题目描述
小明正在参加一场爆破工作。人们在地面上放置了 n n n 个爆炸魔法阵,第 i i i 个魔法阵的圆心坐标为 ( x i , y i ) (x_i, y_i) (xi,yi),半径为 r i r_i ri。如果两个魔法阵相交,则它们可以一起引爆;如果两个魔法阵不相交,则可以再使用一条魔法回路将它们的边缘连接起来。小明想知道最少需要布置总长度多长的魔法回路才能使得所有的魔法阵可以一起引爆?
输入格式
输入共 n + 1 n + 1 n+1 行。
- 第一行为一个正整数 n n n。
- 后面 n n n 行,每行三个整数表示 x i , y i , r i x_i, y_i, r_i xi,yi,ri。
输出格式
输出共 1 1 1 行,一个浮点数表示答案(四舍五入保留两位小数)。
输入输出样例 #1
输入 #1
4
0 0 1
2 0 2
-3 0 1
4 4 1
输出 #1
2.47
说明/提示
样例说明
- 使用魔法回路连接第 1 1 1、 3 3 3 个魔法阵,长度为 1 1 1。
- 使用魔法回路连接第 2 2 2、 4 4 4 个魔法阵,长度为 2 5 − 3 = 1.47 2\sqrt{5} - 3 = 1.47 25−3=1.47。
总长度 2.47 2.47 2.47。
评测用例规模与约定
- 对于 40 % 40\% 40% 的评测用例, n ≤ 500 n \leq 500 n≤500。
- 对于 100 % 100\% 100% 的评测用例, 1 ≤ n ≤ 5000 1\leq n \leq 5000 1≤n≤5000, ∣ x i ∣ , ∣ y i ∣ ≤ 2000 |x_i|, |y_i| \leq 2000 ∣xi∣,∣yi∣≤2000, 0 < r i ≤ 20 0 < r_i \leq 20 0<ri≤20。
解题思路
魔法阵之间:
-
若相交(圆与圆相交或相切),可以直接连通;
-
若不相交,可以用一条魔法回路(即线段)将它们连接起来,花费等于两圆心的距离减去两个半径之和。
因此,我们可以将这些魔法阵看作图中的点,它们之间的“最短连接代价”看作边的权值,求最小总连接长度的问题就变成了**最小生成树(Minimum Spanning Tree,MST)**问题。
我们可以采用经典的 Prim 算法 来求解:
-
任意选择一个起点加入生成树;
-
每次从当前生成树中,选择一条最短的连接边将一个新节点加入;
-
重复该操作直到所有点都加入树中。
在计算两魔法阵间的连接长度时:
-
如果两个魔法阵相交(两圆心距离小于等于半径之和),则不需要额外连接,代价为 0;
-
否则,连接代价为 两圆心距离 - 两圆半径之和。
由于最多只有 5000 个魔法阵,用 Prim 算法配合数组实现可以顺利通过本题。
代码实现
import java.util.Scanner;public class Main {public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();double[][] arr = new double[n][3]; // 存坐标和半径for (int i = 0; i < n; i++) {arr[i][0] = sc.nextDouble(); // xarr[i][1] = sc.nextDouble(); // yarr[i][2] = sc.nextDouble(); // r}boolean[] visited = new boolean[n]; // 标记已连接的魔法阵double[] minDist = new double[n]; // 每个点与当前树的最短距离for (int i = 0; i < n; i++) minDist[i] = Double.MAX_VALUE;double totalLength = 0;minDist[0] = 0; // 从第一个魔法阵开始连接for (int i = 0; i < n; i++) {// 找到当前未访问且距离最小的点int u = -1;for (int j = 0; j < n; j++) {if (!visited[j] && (u == -1 || minDist[j] < minDist[u])) {u = j;}}visited[u] = true;totalLength += minDist[u];// 更新其它点与当前树的最小距离for (int v = 0; v < n; v++) {if (!visited[v]) {double dist = getLength(arr[u][0], arr[u][1], arr[u][2],arr[v][0], arr[v][1], arr[v][2]);if (dist < minDist[v]) {minDist[v] = dist;}}}}System.out.printf("%.2f\n", totalLength);}// 计算两个魔法阵的“连接长度”(如果相交则为0)static double getLength(double x1, double y1, double r1, double x2, double y2, double r2) {double dx = x1 - x2;double dy = y1 - y2;double centerDist = Math.sqrt(dx * dx + dy * dy);double res = centerDist - (r1 + r2);return Math.max(0, res);}
}
6. 题目六:数组翻转
题目描述
小明生成了一个长度为 n n n 的正整数数组 a 1 , a 2 , … , a n a_1, a_2, \dots , a_n a1,a2,…,an,他可以选择连续的一段数 a l , a l + 1 , … , a r a_l, a_{l+1}, \dots, a_r al,al+1,…,ar,如果其中所有数都相等即 a l = a l + 1 = ⋯ = a r a_l = a_{l+1} = \dots = a_r al=al+1=⋯=ar,那么他可以获得 ( r − l + 1 ) × a l (r - l + 1) \times a_l (r−l+1)×al 的分数。
在选择之前,为了让分数尽可能大,他决定先选择数组中的一段区间,对其进行左右翻转。他想知道在对数组进行翻转之后他能获得的最大分数是多少?
提示:当翻转 a l a_l al 到 a r a_r ar 这段区间后,整个数组会变为:
a 1 , a 2 , … , a l − 1 , a r , a r − 1 , … , a l + 1 , a l , a r + 1 , … , a n a_1, a_2, \dots , a_{l-1}, a_r, a_{r-1}, \dots , a_{l+1}, a_l, a_{r+1}, \dots , a_n a1,a2,…,al−1,ar,ar−1,…,al+1,al,ar+1,…,an
输入格式
输入共两行。
- 第一行为一个正整数 n n n。
- 第二行为 n n n 个由空格分开的正整数 a 1 , a 2 , … , a n a_1, a_2, \dots , a_n a1,a2,…,an。
输出格式
输出共 1 1 1 行,一个整数表示答案。
输入输出样例 #1
输入 #1
7
4 4 3 3 2 1 3
输出 #1
9
说明/提示
样例说明
翻转区间 [ 5 , 7 ] [5, 7] [5,7],数组变为 4 , 4 , 3 , 3 , 3 , 1 , 2 4, 4, 3, 3, 3, 1, 2 4,4,3,3,3,1,2,最大分数为选择三个 3 3 3。
评测用例规模与约定
- 对于 20 % 20\% 20% 的评测用例, n ≤ 500 n \leq 500 n≤500。
- 对于 100 % 100\% 100% 的评测用例, 1 ≤ n ≤ 1 0 6 1\leq n \leq 10^6 1≤n≤106, 1 ≤ a i ≤ 1 0 6 1\leq a_i \leq 10^6 1≤ai≤106。
解题思路
所谓翻转操作其实没必要实现,只需要对每个数统计连续出现的次数,保留最大的两个结果。最后在遍历数值乘以(两次连续出现次数和),得到最大值输出即可。
-
比如数值为 x 的最大连续段为 a,次长为 b,翻转后有可能拼接出一段长度 a + b 的连续段,得分为 x × (a + b)。
-
枚举所有数值,统计其前两大连续段长度 a 和 b,取最大得分即可。
代码实现
import java.io.*;
import java.util.*;public class Main {public static void main(String[] args) throws FileNotFoundException {QReader in = new QReader();QWriter out = new QWriter();int n = in.nextInt();int[] arr = new int[n];int[][] tong = new int[1000001][2];for (int i = 0; i < n; i++) {arr[i] = in.nextInt();}for (int i = 0; i < n; i++) {int c = 0;c++;while (i < n - 1 && arr[i] == arr[i + 1]) {i++;c++;}if (c > tong[arr[i]][0]) {tong[arr[i]][1] = tong[arr[i]][0];tong[arr[i]][0] = c;} else if (c > tong[arr[i]][1]) {tong[arr[i]][1] = c;}}long s = 0;for (int i = 0; i < 1000001; i++) {long t = (long) i * (tong[i][1] + tong[i][0]);if (t > s) s = t;}out.println(s);out.close();}static class QReader {private BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));private StringTokenizer tokenizer = new StringTokenizer("");private String innerNextLine() {try {return reader.readLine();} catch (IOException e) {return null;}}public boolean hasNext() {while (!tokenizer.hasMoreTokens()) {String nextLine = innerNextLine();if (nextLine == null) {return false;}tokenizer = new StringTokenizer(nextLine);}return true;}public String next() {hasNext();return tokenizer.nextToken();}public int nextInt() {return Integer.parseInt(next());}public long nextLong() {return Long.parseLong(next());}}static class QWriter implements Closeable {private BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(System.out));public void print(Object object) {try {writer.write(object.toString());} catch (IOException e) {e.printStackTrace();}}public void println(Object object) {try {writer.write(object.toString());writer.write("\n");} catch (IOException e) {e.printStackTrace();}}@Overridepublic void close() {try {writer.close();} catch (IOException e) {e.printStackTrace();}}}
}
7. 题目七:2的幂
题目描述
小明很喜欢 2 2 2 的幂,所以他想对一个长度为 n n n 的正整数数组 { a 1 , a 2 , … , a n } \{a_1, a_2, \dots, a_n\} {a1,a2,…,an} 进行改造。他可以进行如下操作任意多次(可以是 0 0 0 次):任选一个数 a i a_i ai 加上任意正整数,但不能使得加完之后的结果超过 1 0 5 10^5 105。
在操作任意次后,小明希望所有数的乘积是 2 k 2^k 2k 的倍数。他想知道总共需要加的数的总和至少是多少?
输入格式
输入共两行。
- 第一行为两个正整数 n , k n, k n,k。
- 第二行为 n n n 个由空格分开的正整数 a 1 , a 2 , … , a n a_1, a_2, \dots, a_n a1,a2,…,an。
输出格式
输出共 1 1 1 行,一个整数表示答案。如果不能满足条件,输出 − 1 -1 −1。
输入输出样例 #1
输入 #1
3 9
19 10 3
输出 #1
12
说明/提示
样例说明
将三个数分别加到 24 , 16 , 4 24, 16, 4 24,16,4,它们的乘积为 1536 = 2 9 × 3 1536 = 2^9 \times 3 1536=29×3,加的数的总和为 5 + 6 + 1 = 12 5 + 6 + 1 = 12 5+6+1=12。
评测用例规模与约定
- 对于 20 % 20\% 20% 的评测用例, n , k ≤ 10 n, k \leq 10 n,k≤10。
- 对于 100 % 100\% 100% 的评测用例, 1 ≤ n ≤ 500 1\leq n \leq 500 1≤n≤500, 1 ≤ k ≤ 5000 1\leq k \leq 5000 1≤k≤5000, 1 ≤ a i ≤ 100000 1\leq a_i \leq 100000 1≤ai≤100000。
解题思路
这题咱暂时还不会,网上也没找到题解,对这题有兴趣的可以先关注我,等我研究研究后续再更新。
代码实现
// 待补充
8. 题目八:研发资源分配
题目描述
在蓝桥科技公司, A A A 部门和 B B B 部门正在竞争一种新型 AI 芯片的研发资源。
为了公平分配资源,公司设计了一个为期 N N N 天的分配方案:
每天早上, A A A 部门和 B B B 部门各自提交一个需求等级(从 1 1 1 到 N N N 的整数)。提交等级较高的部门获得当天的资源,资源份额等于当天的日期编号(第 1 1 1 天为 1 1 1 单位,第 2 2 2 天为 2 2 2 单位,依次递增)。若两部门提交的等级相同,则当天资源作废,双方均无法获得资源。
每个部门必须在 N N N 天内使用 1 1 1 到 N N N 的所有等级,且每个等级只能使用一次。
有趣的是, A A A 部门在 B B B 部门内部安插了一名 “间谍”,提前获知了 B B B 部门的需求等级提交顺序,记为排列 ( P 1 , P 2 , … , P N P_1, P_2, \dots , P_N P1,P2,…,PN),其中 P i P_i Pi 表示 B B B 部门在第 i i i 天提交的需求等级。
现在,请你帮助 A A A 部门分析,在已知 B B B 部门需求等级顺序的情况下, A A A 部门的总资源份额减去 B B B 部门的总资源份额的差值最大可以是多少?
输入格式
第一行包含一个整数 N N N,表示分配方案的天数。
第二行包含 N N N 个整数 P 1 , P 2 , … , P N P_1, P_2, \dots , P_N P1,P2,…,PN,表示 B B B 部门在第 1 1 1 天到第 N N N 天提交的需求等级。
输出格式
输出一个整数,表示 A A A 部门的总资源份额减去 B B B 部门的总资源份额的最大差值。
输入输出样例 #1
输入 #1
3
1 3 2
输出 #1
2
说明/提示
样例说明
A A A 部门可以选择排列 [ 2 , 1 , 3 ] [2, 1, 3] [2,1,3]:
- 第 1 1 1 天: A ( = 2 ) > B ( = 1 ) A(= 2) > B(= 1) A(=2)>B(=1), A A A 获得 1 1 1 单位资源;
- 第 2 2 2 天: A ( = 1 ) < B ( = 3 ) A(= 1) < B(= 3) A(=1)<B(=3), B B B 获得 2 2 2 单位资源;
- 第 3 3 3 天: A ( = 3 ) > B ( = 2 ) A(= 3) > B(= 2) A(=3)>B(=2), A A A 获得 3 3 3 单位资源。
两者的差值为 4 − 2 = 2 4 - 2 = 2 4−2=2。
评测用例规模与约定
- 对于 20 % 20\% 20% 的评测用例, 1 ≤ N ≤ 11 1 \leq N \leq 11 1≤N≤11, 1 ≤ P i ≤ N 1 \leq P_i \leq N 1≤Pi≤N, P 1 , P 2 , … , P N P_1, P_2, \dots , P_N P1,P2,…,PN 各不相同。
- 对于 100 % 100\% 100% 的评测用例, 1 ≤ N ≤ 1 0 5 1 \leq N \leq 10^5 1≤N≤105, 1 ≤ P i ≤ N 1 \leq P_i \leq N 1≤Pi≤N, P 1 , P 2 , … , P N P_1, P_2, \dots , P_N P1,P2,…,PN 各不相同。
解题思路
这个题有点类似田忌赛马,但是更复杂一些,我们要做的不是单纯赢更多回合,而是赢更“值钱”的回合,或最起码让对方不得分。
-
每一天都可以看成是一个“比赛”机会,比赛的资源份额等于当天是第几天。
-
B 部门在每一天提交了一个数字(1~N 的排列)。
-
你可以将这些数据封装成一个结构体 node{val, pos}:
-
val 表示 B 提交的等级(1~N)
-
pos 表示第几天(资源是 pos 单位)
-
-
然后我们可以 把这些结构体按照 val 从大到小排序,也就是 B 最贪的在前面。
-
如果按照常规的田忌赛马的思路,我们可能会干脆用 1 去和 B 的最大数字对抗,让出这一天,然后保留上等马。但是如果 B 的上等马正好在最后一天,也就是说资源是最大的一天,这时如果使用下等马1,就等于把一大份资源送给了 B,这可能得不偿失。
-
也就是说用下等马输给上等马是有用的,但要看代价是不是太大。如果代价很高(比如是第 N 天),可能就不如直接派出上等马与 B 的上等马打个平手,这样虽说我们也没分,但起码不会让 B 得太多分。
-
正确的做法应该是排序后,模拟让前 k 个最贪的回合给对方(或者跟他打平),剩下的赢回来。
-
在所有 k 情况下取最大值,就是最终的最优差值。
代码实现
import java.util.*;public class Main {static class Node {int val; // B 部门提交的需求等级int pos; // 第几天(资源值为 pos + 1)Node(int val, int pos) {this.val = val;this.pos = pos;}}public static void main(String[] args) {Scanner sc = new Scanner(System.in);int n = sc.nextInt();Node[] a = new Node[n];long total = (long) n * (n + 1) / 2; // 所有资源总和long sum = total;long ans = 0;for (int i = 0; i < n; i++) {int val = sc.nextInt();a[i] = new Node(val, i + 1); // pos 是第几天,从 1 开始}// 按照 val 降序(B 部门需求等级高的排在前)Arrays.sort(a, (x, y) -> y.val - x.val);for (int i = 0; i < n; i++) {sum -= a[i].pos; // 将当天资源让给 Bans = Math.max(ans, sum - a[i].pos); // 更新最大差值}System.out.println(ans);}
}
以上就是 2025 年蓝桥杯 Java B 组全部 8 道真题的整理与解析。
蓝桥杯不仅是一次算法水平的检验,更是一次思维方式和时间管理的挑战。今年的题目让我意识到基础真的非常重要,同时也要不断锻炼自己解决陌生问题的能力。
无论最终成绩如何,这次经历都让我成长了不少。也希望这篇博客能给你带来一些启发。如果你也正在准备蓝桥杯,记得多刷真题、多做总结,相信你也一定能在赛场上发挥出自己的最佳水平!
相关文章:
2025 年蓝桥杯 Java B 组真题解析分享
今年是我第二次参加蓝桥杯软件类Java B组的比赛,虽然赛前做了不少准备,但真正坐在考场上时,还是有种熟悉又紧张的感觉。蓝桥杯的题目一向以“基础创新”著称,今年也不例外,每道题都考验着我们对算法的理解、代码实现能…...
IMX6ULL2025年最新部署方案2在Ubuntu24.04上编译通过Qt5.12.9且部署到IMX6ULL正点原子开发板上
IMX6ULL2025年最新部署方案2:在Ubuntu24.04上编译通过Qt5.12.9且部署到IMX6ULL正点原子开发板上 前言 本篇方案部署是笔者这几天除了打蓝桥杯以外,笔者在研究的东西,现在写道这里的时候,笔者已经成功的在Ubuntu24.04上,使用默…...
通过微信APPID获取小程序名称
进入微信公众平台,登录自己的小程序后台管理端,在“账号设置”中找到“第三方设置” 在“第三方设置”页面中,将页面拉到最下面,即可通过appid获取到这个小程序的名称信息...
混合开发部署实战:PyInstaller + .NET 8 + Docker全链路配置
文章目录 一、PyInstaller打包Python环境1. 基础打包(Linux环境)2. 高级配置3. 验证打包结果 二、.NET 8与Python的集成模式1. 进程调用(推荐方案)2. REST API通信 三、Docker多阶段构建配置1. 完整Dockerfile示例2. 关键配置解析…...
使用 Sass 打造动态星空背景效果
在前端开发中,视觉效果越来越受到重视。本文将通过一个生动的示例,讲解如何利用 Sass 构建一个具有动态星空滚动效果的背景页面,同时也系统介绍 Sass 的核心功能与实践技巧。 一、Sass 的作用 Sass(Syntactically Awesome Style …...
低空经济有哪些GIS相关岗位?
在低空经济中,GIS(地理信息系统)技术发挥着重要作用。GIS开发工程师负责开发、维护和优化与低空经济相关的GIS系统,如无人机起降场布局、空域管理、气象监测等。一般会参与二、三维GIS项目数据处理与前端开发,以及相关…...
Python 垃圾回收机制全解析:内存释放与优化
在编写高效、稳定的 Python 程序时,内存管理往往是一个被忽视但至关重要的领域。对于 Python 开发者来说,最初的学习曲线通常集中在语法、库使用和应用框架上,而对于内存管理和垃圾回收(GC,Garbage Collection…...
性能优化实践
4.1 大规模量子态处理的性能优化 背景与问题分析 量子计算中的大规模量子态处理(如量子模拟、量子态可视化)需要高效计算和实时渲染能力。传统图形API(如WebGL)在处理高维度量子态时可能面临性能瓶颈,甚至崩溃(如表格中14量子比特时WebGL的崩溃)。而现代API(如WebGPU…...
opentelemetry笔记
span https://github.com/open-telemetry/opentelemetry-cpp/blob/f987c9c094f276336569eeea85f17e361de5e518/sdk/src/trace/span.h 在 OpenTelemetry C 的 sdk/src/trace 目录中,不同的 span 定义和实现是为了支持追踪(Tracing)功能的多样…...
【JavaScript】二十一、日期对象
文章目录 1、实例化日期对象2、相关方法3、时间戳4、案例:毕业🎓倒计时效果 1、实例化日期对象 获得当前时间 const date new Date()获得指定时间 const date new Date(2025-4-14 20:46:00) console.log(date)2、相关方法 方法作用说明getFullYear…...
GIT工具学习【1】:新安装git预操作
目录 1.写在前面2.为常用指令配置别名3.初始化4.解决中文乱码问题 1.写在前面 新安装git命令后,需要一些设置会用的比较的顺畅。 这篇文章只要跟着做即可,至于原理,后面会写清楚的。 2.为常用指令配置别名 #新建一个.bashrc touch ~/.bash…...
docker安装ES
ES安装步骤 1. 创建docker网络,使其docker内部通信 2. 下载 | 导入镜像文件(ES Kibana) 3. 创建容器,并访问 4. 安装Ik分词器(es对中文并不友好,所以需要安装IK分词使其适配中文) 1. 创建docke…...
【控制学】控制学分类
【控制学】控制学分类 文章目录 [TOC](文章目录) 前言一、工程控制论1. 经典控制理论2. 现代控制理论 二、生物控制论三、经济控制论总结 前言 控制学是物理、数学与工程的桥梁 提示:以下是本篇文章正文内容,下面案例可供参考 一、工程控制论 1. 经典…...
人工智能应用开发中常见的 工具、框架、平台 的分类、详细介绍及对比
以下是人工智能应用开发中常见的 工具、框架、平台 的分类、详细介绍及对比: 一、工具(Tools) 定义:用于完成特定任务的软件或库,通常专注于开发流程中的某个环节(如数据处理、模型调试、部署等ÿ…...
Linux磁盘格式化(mkfs、mkfs.xfs、mkfs.ext4)、Linux文件系统的校验(xfs_repair、fsck_ext4)
在Linux系统中,磁盘格式化和文件系统校验是系统管理的重要任务。以下是关键步骤和命令的总结: 磁盘格式化 1. 选择文件系统类型 XFS:适用于大文件和高并发场景,支持高性能和扩展性。ext4:成熟稳定的通用文件系统,适合大多数场景。2. 格式化命令 通用格式: sudo mkfs -…...
Android学习总结之git篇
Git 的原理时,你可以从数据结构、对象存储、引用管理、分支与合并等方面结合源码进行分析。以下是详细介绍: 1. 基本数据结构和对象存储 Git 底层主要基于四种对象来存储数据:blob(数据块)、tree(树&…...
Python基础语法——类型
目录 类型的意义动态类型静态类型 类型的意义 不同的类型,占用的内存空间是不同的. 占几个字节 int 默认是 4 个字节.动态扩容 float 固定 8 个字节 bool 一个字节就足够了 str 变长的 不同的类型,对应能够进行的操作也是不同的 int/float, “” “-” “ * ” “/”——不能使…...
vue2中基于el-select封装一个懒加载下拉框
需求 当下拉选项的数据量过大时,后端接口是分页格式返回数据。 解决方案 自定义封装一个懒加载下拉组件,每次滚动到底部时自动获取下一页数据,这样可有效防止数据量过大时造成组件卡顿。 具体实现步骤 1、创建懒加载下拉选择组件 <t…...
uniapp的h5,打开的时候,标题会一闪而过应用名称,再显示当前页面的标题
问题: 微信小程序,通过webview打开了uniapp创建的h5,但是打开h5时,会先显示h5的应用名称,然后才切换为该页面的标题。 过程: 查过很多资料,有说修改应用名称,有说设置navigationS…...
HarmonyOS 5 开发环境全解析:从搭建到实战
鸿蒙来了,从 1.0 到 5.0,它不再只是“华为的操作系统”,而是万物互联生态的核心驱动。作为开发者,你准备好拥抱这个全新时代了吗? 你是否还在犹豫:HarmonyOS 5 开发门槛高不高?该用 DevEco Stu…...
2.2 函数返回值
1.回顾def def sum(x,y): return xy res sum(10,20) #调用函数 print(res) 2.函数的三个重要属性 -函数的类型:function -函数的ID:16进制的整数数值 -函数的值:封装在函数中的数据和代码 # - 函数是一块内存空间,通过…...
OpenAI发布GPT-4.1:开发者专属模型的深度解析 [特殊字符]
最近OpenAI发布了GPT-4.1模型,却让不少人感到困惑。今天我们就来深入剖析这个新模型的关键信息! 重要前提:API专属模型 💻 首先需要明确的是,GPT-4.1仅通过API提供,不会出现在聊天界面中。这是因为该模型主…...
Cython中操作C++字符串
使用Cython开发Python扩展模块-CSDN博客中文末对python代码做了部分C优化,并提及未对字符串类型做优化,并且提到如果不是真正搞懂了C字符串的操作和Python的C API中与字符串相关的知识,最好不要动Python中的字符串类型。为了搞明白在Cython中…...
Dify插件内网安装,解决Dify1.x插件安装总失败问题,手把手教你暴力破解:从镜像源到二进制打包全攻略
背景 自从dify升级到1.0以后,所有的工具和模型都改成了插件化,需要进行插件的安装。在手撕Dify1.x插件报错!从配置到网络到Pip镜像,一条龙排雷实录 已经指出了dify在线安装插件的各种问题。 首发地址 在前面的几个版本中&…...
二极管详解:特性参数、选型要点与分类
一、二极管的基本定义 二极管(Diode) 是由半导体材料(如硅、锗)构成的双端器件,核心特性是单向导电性。其结构基于PN结,正向偏置导通,反向偏置截止。 核心功能: 整流(交…...
BufferedOutputStream 终极解析与记忆指南
BufferedOutputStream 终极解析与记忆指南 一、核心本质 BufferedOutputStream 是 Java 提供的缓冲字节输出流,继承自 FilterOutputStream,通过内存缓冲区显著提升 I/O 性能。 核心特性速查表 特性说明继承链OutputStream → FilterOutputStream → …...
Google政策大更新:影响金融,新闻,社交等所有类别App
Google Play 4月10日 迎来了2025年第一次大版本更新,新政主要涉及金融(个人贷款),新闻两个行业。但澄清内容部分却使得所有行业都需进行一定的更新。下面,我们依次从金融(个人贷款),…...
【Linux网络与网络编程】10.网络层协议IP
前言 我们之前谈的主机B把数据传递给主机C过程都是黑盒式的,即并没有考虑它的中间过程。本篇博客和下一篇博客将要考虑的问题是:主机B和主机C并不是直接连接的,主机B想要把数据传输给主机C需要经过若干路由器的。我们就引出了两个问题&#x…...
Docker 搭建 RabbitMQ
Docker 搭建 RabbitMQ 前言一、准备工作二、设置目录结构三、编写启动脚本四、Host 网络模式 vs Port 映射模式1. Host 网络模式2. Port 映射模式 五、端口配置对比六、配置示例七、查看与管理八、扩展与高可用九、常用命令 前言 在现代微服务与分布式架构中,Rabbi…...
浏览器自动化检测对抗:修改navigator.webdriver属性的底层实现
一、背景介绍:你被自动化检测拒之门外了吗? 在使用 Selenium 或 Playwright 等浏览器自动化工具爬取数据时,经常会遇到「被检测」问题,尤其像 Amazon 这样反爬策略严密的网站。常见的检测机制之一就是检查 JavaScript 中的 navig…...
聊聊Spring AI Alibaba的DocumentParser
序 本文主要研究一下Spring AI Alibaba的DocumentParser DocumentParser spring-ai-alibaba-core/src/main/java/com/alibaba/cloud/ai/document/DocumentParser.java public interface DocumentParser {/*** Parses a given {link InputStream} into a {link Document}. T…...
用css给div列表加个序号
用 CSS 的 counter 相关属性来为列表添加序号。以下是具体的代码,我将以 HTML 文件的形式提供,并且会运行展示效果: .as-div {// counter-reset: my-counter; /* 计数器名称是my-counter */// counter-reset: small-apple; /* 计数器名称是s…...
CSS标签选择器与类选择器
CSS标签选择器 标签选择器(元素选择器)是最基本的选择器之一,用于选择HTML文档中的特定标签元素并应用样式。它使用HTML标签名称作为选择器,选择匹配该标签的所有元素。 作用:通过HTML标签名选择元素 以下是CSS标签选…...
(51单片机)LCD显示日期时间时钟(DS1302时钟模块教学)(LCD1602教程)
目录 源代码 main.c LCD1602.c LCD1602.h DS1302.c DS1302.h 代码解析与教程: LCD1602模块 DS1302模块 效果视频: 源代码 如上图将5个文放在Keli5 中即可,然后烧录在单片机中就行了 烧录软件用的是STC-ISP,不知道怎么安装的…...
编译原理(自考13007)
资源内容 大纲 概述...
C#Winform程序将子窗体嵌入容器方法
private void OpenForm(Form childFrom) { //首先判断容器中是否有其他的窗体 foreach (Control item in this.panelRight.Controls) { if (item is Form) { ((Form)item).Close(); } } //嵌入新的窗体 childFrom.TopLevel false;//将子窗体设置成非顶级控件 childFrom.Parent…...
WPS JS宏编程教程(从基础到进阶)-- 第八部分:字符串技术与WPS结合应用
目录 第8章 字符串技术与WPS结合应用8-1 字符串的3种引用方式场景:动态生成报表标题三种引用方式对比代码解析表模板字符串核心优势8-2 字符串处理之切片与搜索场景:提取身份证中的出生年份三大截取方法对比方法选择指南索引搜索实战8-3 字符串处理之修改与填充场景:规范商品…...
WPS Office安卓版文档编辑功能与兼容性评测【高效编辑】
一、界面设计与操作体验 WPS Office安卓版采用简洁直观的界面设计,首页默认展示近期文档列表,支持一键新建文档、表格或演示文稿。整体操作逻辑与PC端保持一致,新用户也能快速上手。编辑工具栏设计合理,常用功能如字体设置、段落…...
【经验记录贴】使用配置文件提高项目的可维护性
mark一下。 整体修改前后如下: 课题: 在项目中有一个支持的文件类型的FILE_TYPE的定义, 这个是写死在主程序中,每次增加可以支持的文件类型的时候,都需要去修改主程序中这个FILGE_TYPE的定义。 主程序修改其实不太花时…...
传统建筑管理人力成本高,楼宇自控系统如何有效降低运营成本
在传统建筑管理模式下,人力成本一直居高不下,成为建筑运营方沉重的负担。从设备的日常巡检、维护,到环境的调控以及能源的管理,无一不需要大量人力投入。然而,随着科技的飞速发展,楼宇自控系统应运而生&…...
RabbitMQ demo案例
1. 下载和安装 RabbitMQ RabbitMQ 依赖 Erlang 运行时,所以得先装 Erlang,再装 RabbitMQ。下面以 Ubuntu 为例,Windows 和 macOS 也顺便提一下。 1.1 安装 Erlang RabbitMQ 需要 Erlang 支持,先装它。 Windows: 去 Erl…...
第T8周:猫狗识别
🍨 本文为🔗365天深度学习训练营 中的学习记录博客🍖 原作者:K同学啊 第T8周:猫狗识别 tf.config.list_physical_devices(“GPU”),用于检测当前系统是否有可用的 GPU,并将结果存入 gpus 变量。…...
旅游特种兵迪士尼大作战:DeepSeek高精准路径优化
DeepSeek大模型高性能核心技术与多模态融合开发 - 商品搜索 - 京东 随着假期的脚步日渐临近,环球影城等备受瞩目的主题游乐场,已然成为大人与孩子们心中不可或缺的节日狂欢圣地。然而,随之而来的庞大客流,却总让无数游客在欢乐的…...
ffmpeg-将多个视频去掉音频 然后切片组合成一个视频,再将新视频配置上新的音频
需求分解 1、去除原视频的音频轨道。 2、对去掉音频的视频进行切片。 3、将多个视频切片合并为一个新视频。 4、给新的视频添加新的音频轨道。 去除视频音频 要去除视频中的音频,只需使用以下命令 ffmpeg -i input1.mp4 -an -c:v copy output1_no_audio.mp4解释&a…...
05-微服务可观测性体系建设:从日志、监控到链路追踪实战指南
微服务可观测性体系建设:从日志、监控到链路追踪实战指南 一、可观测性:微服务架构的 “神经系统” 1.1 为什么需要可观测性? 在分布式微服务架构中,服务节点可能达数百个,请求链路跨越多服务、数据库、消息队列&am…...
音视频小白系统入门笔记-0
本系列笔记为博主学习李超老师课程的课堂笔记,仅供参阅 音视频小白系统入门课 音视频基础ffmpeg原理 绪论 ffmpeg推流 ffplay/vlc拉流 使用rtmp协议 ffmpeg -i <source_path> -f flv rtmp://<rtmp_server_path> 为什么会推流失败? 默认…...
基于 PyTorch 的 LSTM 实现降雨量预测
基于 PyTorch 的 LSTM 实现降雨量预测示例。包括数据准备、模型定义、训练和预测等。 文章目录 1. 数据准备:2. 模型定义:3. 训练过程:4. 预测和评估:5. 可视化:代码实现1. 数据准备: 使用随机生成的数据作为示例,实际应用中请替换为真实数据。数据被归一化到 [0, 1] 范…...
Spring-Bean的生命周期
一、什么是Bean生命周期? Spring容器中的Bean从创建到销毁的完整过程被称为Bean生命周期,包含实例化→属性注入→初始化→使用→销毁五个核心阶段。Spring提供了丰富的扩展点,允许开发者在各阶段插入自定义逻辑。 二、Bean生命周期全流程&am…...
AI大模型如何重塑科研范式:从“假说驱动”到“数据涌现”
📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:科研进入“模型共研”时代 传统科研范式通常以“假设→实验→验证→理论”的方式推进,这一经典路径建立在人类的认知能力与逻辑推理基础上。然而,随着数据规模的爆炸式增长与知识系统的高度复杂…...
yml文件上传并映射到实体类
文章目录 功能背景功能需要前端开发组件选用组件嵌套和参数绑定上传逻辑示例 后端开发接收逻辑解析逻辑省流纯手动实现(不建议) 功能背景 开发一个配置文件解析功能,需要兼容老版本的配置文件。 功能需要 前端:两个配置文件分别…...