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题:仅实现全排列暴力解法
总结:本届比赛侧重数学思维与贪心策略,传统图论算法应用较少,备考方向需更注重数理逻辑训练。
(注:文中所有图片链接均保留原地址,二维码类图片已按要求移除)
相关文章
暂无评论...