2021年第十二届蓝桥杯 Java B 组省赛填空题解析

本文详细解析了第十二届蓝桥杯 Java B 组省赛的填空题目,涵盖ASCII码、数字统计、直线方程、立方体组合与Dijkstra算法等知识点,旨在帮助参赛者理解和掌握相关算法与数据结构的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第十二届蓝桥杯 Java B 组省赛填空题解析

第一题

【问题描述】

已知大写字母 A A A A S C I I ASCII ASCII 码值为 65 65 65, 那么大写字母 L L L A S C I I ASCII ASCII 码值为多少?

【思路】

签到题

【代码】

public class Q1 {

    public static void main(String[] args) {
        System.out.println((int) ('A'));
    }
}

【答案】

76

第二题

【问题描述】

截屏2021-04-19 08.23.38

【思路】

用数组记录每个数字使用的次数,当拼到 i i i 时的某一位数字不够用,则答案为 i − 1 i - 1 i1

【代码】

import java.util.Arrays;

public class Q2 {

    static int[] a = new int[10];

    static boolean check(int num) {
        while (num > 0) {
            int x = num % 10;
            if (--a[x] < 0)
                return false;
            num /= 10;
        }
        return true;
    }

    public static void main(String[] args) {
        Arrays.fill(a, 2021);
        int i = 0;
        while (true) {
            if (!check(++i))
                break;
        }
        System.out.println(i - 1);
    }
}

【答案】

3181

第三题

【问题描述】

截屏2021-04-19 08.29.07

【思路】

我们可以根据任意两个点确定一条直线

1)当直线不平行于 x x x 轴和 y y y 轴时,可以表示为 y = k x + b y=kx+b y=kx+b 的形式

设两点为 p 1 ( x 1 , y 1 ) , p 2 ( x 2 , y 2 ) p1(x1,y1),p2(x2,y2) p1(x1,y1),p2(x2,y2) x 1 ≠ x 2 且 y 1 ≠ y 2 x1 \neq x2 且 y1\neq y2 x1=x2y1=y2 则有

y − y 1 = ( ( y 2 − y 1 ) / ( x 2 − x 1 ) ) ∗ ( x − x 1 ) y-y1=((y2-y1)/(x2-x1))*(x-x1) yy1=((y2y1)/(x2x1))(xx1)

y 2 − y 1 = d y , x 2 − x 1 = d x y2-y1=dy,x2-x1=dx y2y1=dy,x2x1=dx

k = d y / d x k=dy/dx k=dy/dx

b = ( y 1 ∗ d x − x 1 ∗ d y ) / d x b=(y1*dx-x1*dy)/dx b=(y1dxx1dy)/dx

将得到的 k k k b b b 存入 s e t set set

2)当直线平行于 x x x 轴和 y y y 轴时,只需要加上 x x x 轴和 y y y 轴上的点数

【代码】

1)分数表示,由于浮点数存在精度问题,可以使用分数表示 k k k b b b

import java.util.HashSet;
import java.util.Set;

public class Q3 {

    static int n = 20;
    static int m = 21;
    static Set<String> set = new HashSet<>();

    static int gcd(int x, int y) {
        return y == 0 ? x : gcd(y, x % y);
    }

    public static void main(String[] args) {
        for (int x1 = 0; x1 < n; x1++) {
            for (int y1 = 0; y1 < m; y1++) {
                for (int x2 = 0; x2 < n; x2++) {
                    for (int y2 = 0; y2 < m; y2++) {
                        if (x1 == x2 || y1 == y2) continue;
                        int dy = y2 - y1;
                        int dx = x2 - x1;
                        int g1 = gcd(dx, dy);
                        // 需要将 dy 和 dx 约分
                        String k = (dy / g1) + "/" + (dx / g1);
                        int t = y1 * dx - x1 * dy;
                        int g2 = gcd(t, dx);
                        String b = (t / g2) + "/" + (dx / g2);
                        set.add(k + "," + b);
                    }
                }
            }
        }
        // 别忘了加上平行于 x 轴和 y 轴的直线
        System.out.println(set.size() + n + m);
    }
}
  1. 浮点数表示
import java.util.HashSet;
import java.util.Objects;
import java.util.Set;

public class Q3Beta {

    static int n = 20;
    static int m = 21;
    // 精度
    static double d = 0.000001;
    static Set<Line> set = new HashSet<>();
    static class Line {
        double k;
        double b;

        public Line(double k, double b) {
            this.k = k;
            this.b = b;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Line line = (Line) o;
            return Math.abs(line.k - k) < d &&
                    Math.abs(line.b - b) < d;
        }

        @Override
        public int hashCode() {
            return Objects.hash((int)k, (int)b);
        }
    }

    public static void main(String[] args) {
        for (int x1 = 0; x1 < n; x1++) {
            for (int y1 = 0; y1 < m; y1++) {
                for (int x2 = 0; x2 < n; x2++) {
                    for (int y2 = 0; y2 < m; y2++) {
                        if (x1 == x2 || y1 == y2) continue;
                        double dy = y2 - y1;
                        double dx = x2 - x1;
                        double k = dy / dx;
                        double b = (y1 * dx - x1 * dy) / dx;
                        set.add(new Line(k, b));
                    }
                }
            }
        }
        System.out.println(set.size() + n + m);
    }
}

【答案】

40257

第四题

【问题描述】

截屏2021-04-19 09.02.04

【思路】

若长宽高为 A B C ABC ABC 形,则有 6 6 6 种方案,即 A B C , A C B , B A C , B C A , C A B , C B A ABC,ACB,BAC,BCA,CAB,CBA ABC,ACB,BAC,BCA,CAB,CBA

若为 A A B AAB AAB 形, 则有 3 3 3 种方案,即 A A B , A B A , B A A AAB,ABA,BAA AAB,ABA,BAA

若为 A A A AAA AAA 形,则只有 1 1 1 种方案

由此可知,

当为 A B C ABC ABC 形时,设 L < W < H L<W<H L<W<H

L L L 最大时小于 2021041820210418 3 = 126432.415 \sqrt[3]{2021041820210418}=126432.415 32021041820210418 =126432.415, 暴力计算是可以接受的

【代码】

public class Q4 {

    static long n = 2021041820210418L;
    static int ans;

    public static void main(String[] args) {
        // AAB 和 AAA 形式
        for (long i = 1; i * i <= n; i++) {
            if (n % (i * i) != 0) continue;
            long j = n / (i * i);
            if (j == i)
                ans++;  // AAA 形式只有一种排列方式
            else
                ans += 3; // AAB 形式有三种排列方式
        }

        // ABC 形式,i < j < k
        for (long i = 1; i * i * i < n; i++) {
            if (n % i != 0) continue;
            for (long j = i + 1; j * i < n; j++) {
                // 若 k = n / (i * j) < j, 则退出循环
                if (n / (i * j) < j) break;
                if (n % (i * j) == 0)
                    ans += 6; // ABC 形式有六种排列方式
            }
        }

        System.out.println(ans);
    }
}

【答案】

2430

第五题

【问题描述】

截屏2021-04-19 09.21.36

【思路】

板子题, d i j k s t r a dijkstra dijkstra 算法

【代码】

import java.util.Arrays;
import java.util.PriorityQueue;

public class Q5 {

    static int[] d = new int[2100];
    static boolean[] vis = new boolean[2100];
    static PriorityQueue<Integer> heap = new PriorityQueue<>((o1, o2) -> d[o1] - d[o2]);

    static int gcd(int x, int y) {
        return y == 0 ? x : gcd(y, x % y);
    }

    static int lcm(int x, int y) {
        return x * y / gcd(x, y);
    }

    static void dijkstra() {
        Arrays.fill(d, Integer.MAX_VALUE);
        d[1] = 0;
        vis[1] = true;
        for (int i = 2; i <= 22; i++) {
            d[i] = lcm(1, i);
            heap.add(i);
        }

        while (!heap.isEmpty()) {
            int v = heap.poll();
            if (vis[v]) continue;
            vis[v] = true;
            if (v == 2021) break;
            for (int i = Math.max(1, v - 21); i <= Math.min(2021, v + 21); i++) {
                if (!vis[i]) {
                    d[i] = Math.min(d[i], d[v] + lcm(v, i));
                    heap.add(i);
                }
            }
        }

        System.out.println(d[2021]);
    }

    public static void main(String[] args) {
        dijkstra();
    }
}

【答案】

10266837

### 2024 蓝桥杯 Java B 真题合集 为了帮助参者更好地准备蓝桥杯,以下是整理的自第四届至第十四届蓝桥杯 Java B 真题及其解析。 #### 第四届到第十届蓝桥杯 Java B 真题概述 从2013的第四届开始,蓝桥杯都会举办级选拔。这些事涵盖了多种类型的编程挑战,包括但不限于结果填空、代码填空以及程序设计等不同形式的问题[^1]。 - **第四至第六届**:早期的比主要集中在基础算法的理解与应用上,难度逐渐提升。 - **第七至第九届**:此阶段增加了更多复杂的数据结构操作和高级算法的应用场景。 - **第十届**:进一步提升了对综合能力的要求,不仅考察选手的基础知识掌握情况,更注重实际解决问题的能力。 #### 十一届以后的变化与发展 进入2021后,蓝桥杯继续保持着高水准命题风格的同时,在内容设置方面更加贴近行业发展趋势和技术热点[^2]。 - **第十一届**:引入了一些新兴技术领域内的案例分析作为背景材料,使得题目既具有学术价值又不失趣味性和实用性。 - **第十二届**:强化了对于大数据处理能力和多线程并发控制技巧等方面的考核力度。 - **第十三届**:特别强调了安全编码意识的重要性,并通过具体实例引导学生思考如何构建更为健壮可靠的软件系统。 #### 关于最新的一届——第十四届蓝桥杯 针对刚刚结束不久的2024第十四届蓝桥杯Java B,官方提供了详细的试题解答指南。其中提到一些关键知识点如大整数运算(BigInteger)、动态规划等问题求解方法得到了广泛应用。值得注意的是,在面对某些特定类型的大规模数据计算时,合理利用数学规律可以有效简化问题并提高效率[^3]。 ```java import java.math.BigInteger; public class FactorialCalculation { public static void main(String[] args) { BigInteger result = factorial(new BigInteger("100")); System.out.println(result); } private static BigInteger factorial(BigInteger n){ if(n.equals(BigInteger.ZERO)){ return BigInteger.ONE; }else{ return n.multiply(factorial(n.subtract(BigInteger.ONE))); } } } ``` 上述代码展示了使用 `BigInteger` 类来解决超出了基本数值范围的情况下的阶乘计算问题。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值