2020年 第11届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2020.7.5】

目录

一、试题 A: 解密

二、试题 B: 纪念日

三、试题 C: 合并检测

四、试题 D: 分配口罩

五、试题 E: 斐波那契数列最大公约数

六、试题F: 分类计数

七、试题G: 八次求和

八、试题 H: 字符串编码

九、试题 I: BST 插入节点问题

十、试题 J: 网络分析

小结


一、试题 A: 解密

本题总分:5 分

【问题描述】

小明设计了一种文章加密的方法:对于每个字母 c,将它变成某个另外的字符 Tc。下表给出了字符变换的规则:

                                    

例如,将字符串 YeRi 加密可得字符串 EaFn。

小明有一个随机的字符串,加密后为

EaFnjISplhFviDhwFbEjRjfIBBkRyY

(由 30 个大小写英文字母组成,不包含换行符),请问原字符串是多少?

(如果你把以上字符串和表格复制到文本文件中,请务必检查复制的内容是否与文档中的一致。在试题目录下有一个文件 str.txt,第一行为上面的字符串,后面 52 行依次为表格中的内容。)

【答案提交】

这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个只包含 30 个大小写英文字母的字符串,在提交答案时只填写这个字符串,填写多余的内容将无法得分。

【答案】:YeRikGSunlRzgDlvRwYkXkrGWWhXaA

 
  

二、试题 B: 纪念日

本题总分:5 分

题目链接:2020年 第11届 蓝桥杯 C/C++ B组 省赛真题详解及小结【第1场省赛2020.7.5】【Java版】

【答案】:52038720 

三、试题 C: 合并检测

本题总分:10 分

题目链接:2020年 第11届 蓝桥杯 Java C组 省赛真题详解及小结【第1场省赛 2020.7.5】

【答案】:10

四、试题 D: 分配口罩

本题总分:10 分

【问题描述】

某市市长获得了若干批口罩,每一批口罩的数目如下:(如果你把以下文字复制到文本文件中,请务必检查复制的内容是否与文档中的一致。在试题目录下有一个文件 mask.txt,内容与下面的文本相同)

9090400

8499400

5926800

8547000

4958200

4422600

5751200

4175600

6309600

5865200

6604400

4635000

10663400

8087200

4554000

现在市长要把口罩分配给市内的 2 所医院。由于物流限制,每一批口罩只能全部分配给其中一家医院。市长希望 2 所医院获得的口罩总数之差越小越好。请你计算这个差最小是多少?

【答案提交】

这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

五、试题 E: 斐波那契数列最大公约数

本题总分:15 分

【问题描述】

斐波那契数列满足 F1 = F2 = 1,从 F3 开始有 Fn = Fn−1 + Fn−2。请你计算 GCD(F2020, F520),其中 GCD(A, B) 表示 A 和 B 的最大公约数。

【答案提交】

这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

六、试题F: 分类计数

【问题描述】

输入一个字符串,请输出这个字符串包含多少个大写字母,多少个小写字母,多少个数字。

【输入格式】

输入一行包含一个字符串。

【输出格式】

输出三行,每行一个整数,分别表示大写字母、小写字母和数字的个数。

【样例输入】

1+a=Aab

【样例输出】

1 3 1

【评测用例规模与约定】

对于所有评测用例,字符串由可见字符组成,长度不超过 100。

自己的代码:

import java.io.*;
import java.math.BigInteger;
import java.util.*;


public class Main
{
    static PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    static int N = (int)1e5 + 10;

    public static void main(String[] args) throws NumberFormatException, IOException
    {
        char s[] = rd.nextLine().toCharArray();

        int res_A = 0;
        int res_a = 0;
        int res_num = 0;
        for(int i = 0 ; i < s.length ; i ++)
        {
            if(s[i] >= 'A' && s[i] <= 'Z')  res_A ++;
            if(s[i] >= 'a' && s[i] <= 'z')  res_a ++;
            if(s[i] >= '0' && s[i] <= '9')  res_num ++;
        }
        pw.print(res_A + " " + res_a + " " + res_num);
        pw.flush();
    }
}

class MyComparator implements Comparator
{
    @Override
    public int compare(Integer o1, Integer o2) {
        return o2 - o1;
    }
}

class rd
{
    static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer tokenizer = new StringTokenizer("");

    static String nextLine() throws IOException { return reader.readLine(); }
    static String next() throws IOException
    {
        while(!tokenizer.hasMoreTokens())  tokenizer = new StringTokenizer(reader.readLine());
        return tokenizer.nextToken();
    }
    static int nextInt() throws IOException { return Integer.parseInt(next()); }
    static double nextDouble() throws IOException { return Double.parseDouble(next()); }
    static long nextLong() throws IOException { return Long.parseLong(next()); }
    static BigInteger nextBigInteger() throws IOException
    {
        BigInteger d = new BigInteger(rd.nextLine());
        return d;
    }
}

class PII implements Comparable
{
    long x,y;
    public PII(long x ,long y)
    {
        this.x = x;
        this.y = y;
    }
    public int compareTo(PII a)
    {
        if(this.y-a.y != 0)
            return Math.toIntExact(this.y - a.y);  //按x升序排序
        else return Math.toIntExact(this.x - a.x);  //如果x相同,按y升序排序
    }
}

class Edge
{
    int a,b,c;
    public Edge(int a ,int b, int c)
    {
        this.a = a;
        this.b = b;
        this.c = c;
    }
}

七、试题G: 八次求和

时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分

【问题描述】

给定正整数 n, 求 1^{8}2^{8} + · · · + n^{8} mod 123456789 。其中 mod 表示取余。

【输入格式】

输入的第一行包含一个整数 n。

【输出格式】

输出一行,包含一个整数,表示答案。

【样例输入】

2

【样例输出】

257

【样例输入】

987654

【样例输出】

43636805

【评测用例规模与约定】

对于 20% 的评测用例,1 ≤ n ≤ 20。

对于 60% 的评测用例,1 ≤ n ≤ 1000。

对于所有评测用例,1 ≤ n ≤ 1000000。

 自己的代码:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.*;



public class Main
{
    static PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    static int N = (int)1e5 + 10;
    static int n;
    static int w[] = new int[N];

    public static void main(String[] args ) throws IOException
    {
        int n = rd.nextInt();

        BigInteger sum = BigInteger.ZERO; // BigInteger初始成0,香的嘞
        for(int i = 1 ; i <= n ; i ++)
        {
            BigInteger k = BigInteger.valueOf(i).multiply(BigInteger.valueOf(i)).multiply(BigInteger.valueOf(i)).multiply(BigInteger.valueOf(i)).multiply(BigInteger.valueOf(i)).multiply(BigInteger.valueOf(i)).multiply(BigInteger.valueOf(i)).multiply(BigInteger.valueOf(i));//不知道这个地方为为什么直接用pow(8)第二个样例结果不对
            sum = sum.add(k);
        }
        pw.println(sum.mod(BigInteger.valueOf(123456789)));
        pw.flush();
    }
}

class rd
{
    static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer tokenizer = new StringTokenizer("");

    static String nextLine() throws IOException  { return reader.readLine(); }

    static String next() throws IOException
    {
        while (!tokenizer.hasMoreTokens())  tokenizer = new StringTokenizer(reader.readLine());
        return tokenizer.nextToken();
    }

    static int nextInt() throws IOException  { return Integer.parseInt(next()); }

    static double nextDouble() throws IOException { return Double.parseDouble(next()); }

    static long nextLong() throws IOException  { return Long.parseLong(next());}

    static BigInteger nextBigInteger() throws IOException
    {
        BigInteger d = new BigInteger(rd.nextLine());
        return d;
    }
}

class PII
{
    int x,y;
    public PII(int x ,int y)
    {
        this.x = x;
        this.y = y;
    }
}

八、试题 H: 字符串编码

时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分

【问题描述】

小明发明了一种给由全大写字母组成的字符串编码的方法。对于每一个大写字母,小明将它转换成它在 26 个英文字母中序号,即 A → 1, B → 2, ... Z → 26。

这样一个字符串就能被转化成一个数字序列:

比如 ABCXYZ → 123242526。

现在给定一个转换后的数字序列,小明想还原出原本的字符串。当然这样的还原有可能存在多个符合条件的字符串。小明希望找出其中字典序最大的字符串。

【输入格式】

一个数字序列。

【输出格式】

一个只包含大写字母的字符串,代表答案。

【样例输入】

123242526

【样例输出】

LCXYZ

【评测用例规模与约定】

对于 20% 的评测用例,输入的长度不超过 20。

对于所有评测用例,输入的长度不超过 200000。

百度百科——ASCII

自己的代码:

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.math.BigInteger;
import java.util.*;

public class Main
{
    static PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    static Map map = new HashMap<>();
    static List list = new ArrayList<>();

    static void init()
    {
        map.put("1",'A');
        map.put("2",'B');
        map.put("3",'C');
        map.put("4",'D');
        map.put("5",'E');
        map.put("6",'F');
        map.put("7",'G');
        map.put("8",'H');
        map.put("9",'I');
        map.put("10",'J');
        map.put("11",'K');
        map.put("12",'L');
        map.put("13",'M');
        map.put("14",'N');
        map.put("15",'O');
        map.put("16",'P');
        map.put("17",'Q');
        map.put("18",'R');
        map.put("19",'S');
        map.put("20",'T');
        map.put("21",'U');
        map.put("22",'V');
        map.put("23",'W');
        map.put("24",'X');
        map.put("25",'Y');
        map.put("26",'Z');
    }

    public static void main(String[] args) throws IOException
    {
        init();
        String s = rd.nextLine();

        int i = 0;
        while(i != s.length())
        {
            if(s.substring(i,i + 2).compareTo("0") >= 0 && s.substring(i,i + 2).compareTo("26") <= 0 && i != s.length() - 1) // 子串字典序"1"~“26”,i != s.length() - 1是防止最后剩下一个数字字符,然后i指针跳两下,就寄了
            {
                list.add(map.get(s.substring(i,i + 2))); // 将该字符子串加入list
                i += 2;
            }
            else
            {
                list.add(map.get(s.substring(i,i + 1)));
                i += 1;
            }
        }
        for(Character c: list)  pw.print(c);
        pw.flush();
    }
}

class rd
{
    static BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    static StringTokenizer tokenizer = new StringTokenizer("");

    static String nextLine() throws IOException   { return reader.readLine(); }

    static String next() throws IOException
    {
        while (!tokenizer.hasMoreTokens())  tokenizer = new StringTokenizer(reader.readLine());
        return tokenizer.nextToken();
    }

    static int nextInt() throws IOException  { return Integer.parseInt(next()); }

    static double nextDouble() throws IOException { return Double.parseDouble(next()); }

    static long nextLong() throws IOException  { return Long.parseLong(next());}

    static BigInteger nextBigInteger() throws IOException
    {
        BigInteger d = new BigInteger(rd.nextLine());
        return d;
    }
}

class PII implements Comparable
{
    int x,y;
    public PII(int x ,int y)
    {
        this.x = x;
        this.y = y;
    }

    @Override
    public int compareTo(PII o)
    {
        return this.x - o.x;
    }
}

九、试题 I: BST 插入节点问题

时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分

【问题描述】

给定一棵包含 N 个节点的二叉树,节点编号是 1 ∼ N。其中 i 号节点具有权值 W_{i},并且这些节点的权值恰好形成了一棵排序二叉树 (BST)。

现在给定一个节点编号 K,小明想知道,在这 N 个权值以外,有多少个整数 X (即 X 不等于任何 W_{i} ) 满足:给编号为 K 的节点增加一个权值为 X 的子节点,仍可以得到一棵 BST。

例如在下图中,括号外的数字表示编号、括号内的数字表示权值。即编号 1 ∼ 4 的节点权值依次是 0、10、20、30。

如果 K = 1,那么答案为 0。因为 1 号节点已经有左右子节点,不能再增加子节点了。

如果 K = 2,那么答案为无穷多。因为任何一个负数都可以作为 2 的左子节点。

如果 K = 3,那么答案为 9。因为 X = 11, 12, · · · , 19 都可以作为 3 的左子节点。

【输入格式】

第一行包含 2 个整数 N 和 K。

以下 N 行每行包含 2 个整数,其中第 i 行是编号为 i 的节点的父节点编号 Pi 和权值 W_{i} 。注意 Pi = 0 表示 i 是根节点。

输入保证是一棵 BST。

【输出格式】

一个整数代表答案。如果答案是无穷多,输出 −1。

【样例输入】

4 3

0 10

1 0

1 20

3 30

【样例输出】

9

【评测用例规模与约定】

对于 60% 的评测用例,1 ≤ K ≤ N ≤ 100,0 ≤ W_{i} ≤ 200,且 W_{i} 各不相同。

对于所有评测用例,1 ≤ K ≤ N ≤ 10000,0 ≤ W_{i} ≤ 100000000,且 W_{i} 各不相同。

十、试题 J: 网络分析

时间限制: 1.0s 内存限制: 256.0MB 本题总分:25 分

【问题描述】

小明正在做一个网络实验。

他设置了 n 台电脑,称为节点,用于收发和存储数据。

初始时,所有节点都是独立的,不存在任何连接。

小明可以通过网线将两个节点连接起来,连接后两个节点就可以互相通信了。两个节点如果存在网线连接,称为相邻。

小明有时会测试当时的网络,他会在某个节点发送一条信息,信息会发送到每个相邻的节点,之后这些节点又会转发到自己相邻的节点,直到所有直接或间接相邻的节点都收到了信息。所有发送和接收的节点都会将信息存储下来。一条信息只存储一次。

给出小明连接和测试的过程,请计算出每个节点存储信息的大小。

【输入格式】

输入的第一行包含两个整数 n, m,分别表示节点数量和操作数量。节点从 1 至 n 编号。

接下来 m 行,每行三个整数,表示一个操作。

如果操作为 1 a b,表示将节点 a 和节点 b 通过网线连接起来。当 a = b 时,表示连接了一个自环,对网络没有实质影响。

如果操作为 2 p t,表示在节点 p 上发送一条大小为 t 的信息。

【输出格式】

输出一行,包含 n 个整数,相邻整数之间用一个空格分割,依次表示进行完上述操作后节点 1 至节点 n 上存储信息的大小。

【样例输入】

4 8

1 1 2

2 1 10

2 3 5

1 4 1

2 2 2

1 1 2

1 2 4

2 2 1

【样例输出】

13 13 5 3

【评测用例规模与约定】

对于 30% 的评测用例,1 ≤ n ≤ 20,1 ≤ m ≤ 100。

对于 50% 的评测用例,1 ≤ n ≤ 100,1 ≤ m ≤ 1000。

对于 70% 的评测用例,1 ≤ n ≤ 1000,1 ≤ m ≤ 10000。

对于所有评测用例,1 ≤ n ≤ 10000,1 ≤ m ≤ 100000,1 ≤ t ≤ 100。

 
  

小结

仔细、认真,注意日期类、大整数BigInteger的使用。

你可能感兴趣的:(java,算法,蓝桥杯,java,蓝桥杯)