[第十六届蓝桥杯 JavaB 组解题思路与参赛心得]

A:高塔脱险(已通过)

题目示意图
这道基础题目考察循环遍历的应用。解题时需特别注意数值范围问题,务必使用long类型变量,否则会导致数据溢出。
✏️ 参考实现

import java.util.*;
import java.io.*;
public class Solution {
static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
long total = 0;
for(long num = 1; num <= 20240413; num++){
if(num % 20250412 == 0) total += num;
}
System.out.println(total);
}
}

B:数字谜题(已解决)

问题图示
最初尝试暴力解法未果后,发现关键在于最小公倍数的性质
- 设c为a和b的最小公倍数,则c满足c = (a×b)/gcd(a,b)
- 根据题意推导可得n = c - a - b
? 核心代码

public class Main {
public static void main(String[] args) {
long a = 20250412, b = 20240413;
System.out.println(lcm(a,b) - a - b);
}
static long gcd(long x, long y) {
return y == 0 ? x : gcd(y, x%y);
}
static long lcm(long x, long y) {
return x*y/gcd(x,y);
}
}

最终答案:409876661809331

C:电力分配(已AC)

题目描述
本题核心在于理解异或运算的特性
1. 若数组可分两组且异或和相等,则整体异或结果必为0
2. 反之,若整体异或为0,则必然存在这样的分组方式
? 实现示例

import java.util.*;
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(), xor = 0;
int[] nums = new int[n];
for(int i=0; i<n; i++) {
nums[i] = sc.nextInt();
xor ^= nums[i];
}
System.out.println(xor==0 ? "YES" : "NO");
}
}
}

D:魔法组合(解题思路)

数据范围
采用埃拉托斯特尼筛法预处理素数:
- 注意组合去重问题,如1+6与3+4视为相同
- 使用HashSet存储已出现的和值
?️ 代码片段

static void sieve() {
Arrays.fill(isPrime, true);
for(int i=2; i*i<=N; i++)
if(isPrime[i])
for(int j=i*i; j<=N; j+=i)
isPrime[j] = false;
}

F:序列重构(AC方案)

题目说明
优化思路:
- 无需实际翻转数组,只需统计相同数值的最长连续子序列
- 结果即为两个最长同值子序列的长度之和
? 关键算法

Map<Integer, Integer> maxLen = new HashMap<>();
int currLen = 1;
for(int i=1; i<n; i++) {
if(arr[i]==arr[i-1]) currLen++;
else {
updateMax(maxLen, arr[i-1], currLen);
currLen = 1;
}
}

其他题目备注

  • E题:尝试用Dijkstra求解但未完全掌握
  • G题:采用特判策略(直接检测初始状态)
  • H题:仅实现全排列暴力解法
    总结:本届比赛侧重数学思维与贪心策略,传统图论算法应用较少,备考方向需更注重数理逻辑训练。
    (注:文中所有图片链接均保留原地址,二维码类图片已按要求移除)

相关文章

暂无评论

暂无评论...