2021第十二届蓝桥杯省赛java b组 题目+答案

这篇博客详细介绍了2021年蓝桥杯省赛Java B组的比赛题目,包括A到J共10道算法题目,涉及ASCII码、卡片拼数、直线计算、货物摆放、最短路径、时间转换、最少砝码、杨辉三角、双向排序和括号序列等。每道题目都有问题描述、输入输出格式、样例及解答,解答中分享了解题思路和错误反思。

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


2021/6/8

嗯…混了个国二



2021/4/28

这都能省一。。。好水啊。。。


原文件下载

A:ASC

【问题描述】

已知大写字母 A 的 ASCII 码为 65,请问大写字母 L 的 ASCII 码是多少?


【答案】

76



签到题😃

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


B:卡片

【问题描述】

​ 小蓝有很多数字卡片,每张卡片上都是数字 0 到 9。
​ 小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个,
就保存起来,卡片就不能用来拼其它数了。
​ 小蓝想知道自己能从 1 拼到多少。
​ 例如,当小蓝有 30 张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10,但是拼 11 时卡片 1 已经只有一张了,不够拼出 11。
​ 现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 1 拼到多少?


【答案】

3181



用一个长度为 10 的数组存储 0 到 9 剩余的卡片,列出每一个数字变成字符串,如果当前为 0 就代表不能拼出当前卡片,然后输出上一个卡片就好了

import java.util.Arrays;

public class Main {
   
   
    public static void main(String[] args) {
   
   
        int[] chs = new int[10];
        Arrays.fill(chs, 2021);

        for (int i = 1; ; i++) {
   
   
            for (char c : String.valueOf(i).toCharArray()) {
   
   
                if (chs[c - '0'] == 0) {
   
   
                    System.out.println(i-1);
                    return;
                }
                chs[c - '0']--;
            }
        }
    }
}



C:直线

【问题描述】

​ 在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上,那么这些点中任意两点确定的直线是同一条。
​ 给定平面上 2 × 3 2 × 3 2×3 个整点 ( x , y ) ∣ 0 ≤ x < 2 , 0 ≤ y < 3 , x ∈ Z , y ∈ Z {(x,y)|0 ≤ x < 2,0 ≤ y < 3, x ∈ Z,y ∈ Z} (x,y)0x<2,0y<3,xZ,yZ,即横坐标是 0 0 0 1 1 1 (包含 0 0 0 1 1 1) 之间的整数、纵坐标是 0 0 0 2 2 2 (包含 0 0 0 2 2 2) 之间的整数的点。这些点一共确定了 11 11 11 条不同的直线。
​ 给定平面上 20 × 21 20 × 21 20×21 个整点 ( x , y ) ∣ 0 ≤ x < 20 , 0 ≤ y < 21 , x ∈ Z , y ∈ Z {(x,y)|0 ≤ x < 20,0 ≤ y < 21, x ∈ Z,y ∈ Z} (x,y)0x<20,0y<21,xZ,yZ,即横坐标是 0 0 0 19 19 19 (包含 0 0 0 19 19 19) 之间的整数、纵坐标是 0 0 0 20 20 20 (包含 0 0 0 20 20 20) 之间的整数的点。请问这些点一共确定了多少条不同的直线。


【答案】

40257



思路是枚举每一个起点和终点,然后用 y = k x + b y=kx+b y=kx+b 计算出斜率 k k k b b b ,然后出重。不过 k k k 还有可能是小数,就天真的用 d o u b l e double double 处理了。考完出来对了答案才发现精度爆炸了。。。

最后的实现方法是用 String 表示分数,Set去重,然后还要做些细节的处理。

import java.util.*;

class Line {
   
   
    String k;
    String b;

    @Override
    public boolean equals(Object o) {
   
   
        Line line = (Line) o;
        return Objects.equals(k, line.k) && Objects.equals(b, line.b);
    }

    @Override
    public int hashCode() {
   
   
        int result = k != null ? k.hashCode() : 0;
        result = 31 * result + (b != null ? b.hashCode() : 0);
        return result;
    }
}

class Point {
   
   
    int x;
    int y;
}

public class Main {
   
   
    static int gcd(int a, int b) {
   
   
        return b == 0 ? a : gcd(b, a % b);
    }

    public static void</
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值