欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

4. 蓝桥杯-第十一届JavaB组省赛真题

程序员文章站 2022-06-13 11:46:07
...

蓝桥杯-第十一届JavaB组7月5日省赛真题

1. 解密

问题描述:

  1. 小明设计了一种文章加密的方法:对于每个字母 C,将它变成某个另外的字符 Tc 。下表给出了字符变换的规则:
  2. 4. 蓝桥杯-第十一届JavaB组省赛真题
  3. 例如,将字符串 YeRi 加密可得字符串 EaFn。
  4. 小明有一个随机的字符串,加密后为EaFnjISplhFviDhwFbEjRjfIBBkRyY(由 30 个大小写英文字母组成,不包含换行符),请问原字符串是多少?(填空题5分)

答案:YeRikGSunlRzgDlvRwYkXkrGWWhXaA

/**
 * @Date 2020/10/14 21:25
 * @Version 10.21
 * @Author DuanChaojie
 */
public class Main1 {
    public static void main(String[] args) {
        // 加密后的字符
        String str = "EaFnjISplhFviDhwFbEjRjfIBBkRyY";
        
        char[] arr = str.toCharArray();
        
        // 原字符
        String s1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
        
        // 加密后的字符
        String s2 = "yxmdacikntjhqlgoufszpwbrevYXMDACIKNTJHQLGOUFSZPWBREV";

        // 遍历加密后的字符串
        StringBuilder sb = new StringBuilder();

        for (int i = 0; i < arr.length; i++) {
            int index = s2.indexOf(arr[i]);
            sb.append(s1.charAt(index));
        }
        
        // YeRikGSunlRzgDlvRwYkXkrGWWhXaA
        System.out.println(sb.toString());
    }
}

2. 纪念日

问题描述:

  1. 2020 年 7 月 1 日是中国*成立 99 周年纪念日。
  2. 中国*成立于 1921 年 7 月 23 日。
  3. 请问从 1921 年 7 月 23 日中午 12 时到 2020 年 7 月 1 日中午 12 时一共包含多少分钟?填空题5分

答案:52038720

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @Date 2020/10/14 21:34
 * @Version 10.21
 * @Author DuanChaojie
 */
public class Main2 {
    public static void main(String[] args) {
        SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
        try {
            Date date1 = format.parse("1921-07-23");
            Date date2 = format.parse("2020-07-01");
            // 获得相差的毫秒数
            long date1Time = date1.getTime();
            long date2Time = date2.getTime();
            // 52038720
            System.out.println((date2Time-date1Time)/(1000*60));

            System.out.println("*********方法二**************");
            main2();
        } catch (ParseException e) {
            e.printStackTrace();
        }
    }

    public static void main2(){
        /**
         * 为什么要用21和120的原因
         * int y = year + 1900;
         */
        Date date1 = new Date(21, 7, 23, 12, 0, 0);
        Date date2 = new Date(120, 7, 1, 12, 0, 0);

        long date1Time = date1.getTime();
        long date2Time = date2.getTime();
        System.out.println((date2Time-date1Time)/(1000*60));
    }
}

3. 合并检测

  1. 新冠疫情由新冠病毒引起,最近在 A 国蔓延,为了尽快控制疫情,A 国准备给大量民众进病毒核酸检测。然而,用于检测的试剂盒紧缺。为了解决这一困难,科学家想了一个办法:合并检测。即将从多个人(k个)采集的标本放到同一个试剂盒中进行检测。如果结果为阴性,则说明这 k个人都是阴性,用一个试剂盒完成了 k 个人的检测。如果结果为阳性,则说明至少有一个人为阳性,需要将这 k 个人的样本全部重新独立检测(从理论上看,如果检测前 k−1 个人都是阴性可以推断出第 k 个人是阳性,但是在实际操作中不会利用此推断,而是将 k 个人独立检测),加上最开始的合并检测,一共使用了 k + 1 个试剂盒完成了 k 个人的检测。
  2. A 国估计被测的民众的感染率大概是 1%,呈均匀分布。请问 k 取多少能最节省试剂盒?

题解:

  1. 假设这个国家有n个人,这个我们n=10000000为常数(这里取一常数方便理解)。
  2. 感染的人有0.01n个人。
  3. 我们假设将人分组,k个人一组 。
  4. 需要的试剂的数量y是:

y = n / k + 0.01 ∗ n ∗ k y = n/k + 0.01*n*k y=n/k+0.01nk

  1. 对k进行求导的:

y ′ = − 1 ∗ ( n / k 2 ) + 0.01 ∗ n y' = -1*(n / k^2) + 0.01*n y=1(n/k2)+0.01n

  1. 要使y最小则:

( n / k 2 ) = 0.01 ∗ n (n / k^2) = 0.01*n (n/k2)=0.01n

  1. 得到结果k=10。

4. 分配口罩

问题描述:

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

    9090400
    8499400
    5926800
    8547000
    4958200
    4422600
    5751200
    4175600
    6309600
    5865200
    6604400
    4635000
    10663400
    8087200
    4554000
    
  2. 现在市长要把口罩分配给市内的 2 所医院。由于物流限制,每一批口罩只能全部分配给其中一家医院。市长希望 2 所医院获得的口罩总数之差越小越好。请你计算这个差最小是多少?填空题10分

2400

5. 斐波那契数列最大公约数

问题描述:

  1. 4. 蓝桥杯-第十一届JavaB组省赛真题
  2. 填空题15分

答案:6765

/**
 * @Date 2020/10/15 0:23
 * @Version 10.21
 * @Author DuanChaojie
 */
public class Main5 {
    public static void main(String[] args) {
        // int long型数据均会爆数组
        BigInteger[] arr = new BigInteger[2025];
        // 注意下标为零值也为零
        arr[0] = BigInteger.ZERO;

        arr[1] = arr[2] = BigInteger.ONE;
        for (int i = 3; i <= 2020; i++) {
            arr[i] = arr[i-1].add(arr[i-2]);
        }
        // 这个值超过int的范围
        System.out.println(arr[520]);
        // 这个值超过了long的范围
        System.out.println(arr[2020]);
        
        BigInteger gcd = arr[2020].gcd(arr[520]);
        System.out.println(gcd);

    }
}

BigInteger gcd(BigInteger val) 返回大整数的最大公约数

    public BigInteger gcd(BigInteger val) {
        if (val.signum == 0)
            return this.abs();
        else if (this.signum == 0)
            return val.abs();

        MutableBigInteger a = new MutableBigInteger(this);
        MutableBigInteger b = new MutableBigInteger(val);

        MutableBigInteger result = a.hybridGCD(b);

        return result.toBigInteger(1);
    }

6. 分类计数

问题描述:

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

输入格式:

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

输出格式:

  1. 输出三行,每行一个整数,分别表示大写字母、小写字母和数字的个数。
样例输入
1+a=Aab
    
样例输出
1
3
1

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

import java.util.Scanner;

/**
 * @Date 2020/10/15 0:54
 * @Version 10.21
 * @Author DuanChaojie
 */
public class Main6 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        String str = scanner.next();
        char[] chars = str.toCharArray();
        int countAZ = 0;
        int countaz = 0;
        int countNum = 0;
        // 遍历字符数组
        for (int i = 0; i < chars.length; i++) {
            if (chars[i] >= 'A' && chars[i] <= 'Z'){
                countAZ++;
            }
            if (chars[i] >= 'a' && chars[i] <= 'z'){
                countaz++;
            }
            if (chars[i] >= '0' && chars[i] <= '9'){
                countNum++;
            }
        }

        System.out.println(countAZ);
        System.out.println(countaz);
        System.out.println(countNum);
    }
}

7. 八次求和

问题描述

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

输入格式

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

输出格式

  1. 输出一行,包含一个整数,表示答案。
样例输入
2
样例输出
257
    
样例输入
987654
样例输出
43636805

评测用例规模与约定:

  1. 对于 20% 的评测用例,1 ≤ n ≤ 20。
  2. 对于 60% 的评测用例,1 ≤ n ≤ 1000。
  3. 对于所有评测用例,1 ≤ n ≤ 1000000
import java.util.Scanner;

/**
 * @Date 2020/10/15 1:02
 * @Version 10.21
 * @Author DuanChaojie
 */
public class Main7 {
    private static long mod = 123456789;
    public static void main(String[] args) {
        
        Scanner scanner = new Scanner(System.in);
        int n = scanner.nextInt();
        
        long sum = 0;
        
        for (int i = 1; i <= n; i++) {
            sum = (sum + getEight(i))%mod;
        }
        
        System.out.println(sum);
    }

    /**
     * 计算 i 的八次方并返回
     * @param i
     */
    private static long getEight(int i) {
        long result = i;

        for (int j = 0; j < 7; j++) {
            result = ((result%mod)*(i%mod)) % mod;
        }
        return result;
    }

}

8. 字符串编码

问题描述:

  1. 小明发明了一种给由全大写字母组成的字符串编码的方法。对于每一个大写字母,小明将它转换成它在 26 个英文字母中序号,即 A → 1, B → 2, ... Z →26。这样一个字符串就能被转化成一个数字序列:比如 ABCXYZ → 123242526。
  2. 现在给定一个转换后的数字序列,小明想还原出原本的字符串。当然这样的还原有可能存在多个符合条件的字符串。小明希望找出其中字典序最大的字符串。

输入格式:

  1. 一个数字序列。

输出格式:

  1. 一个只包含大写字母的字符串,代表答案
样例输入
123242526
    
样例输出
LCXYZ

评测用例规模与约定:

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

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

import java.util.Scanner;

/**
 * @Date 2020/10/15 1:09
 * @Version 10.21
 * @Author DuanChaojie
 */
public class Main8 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        // 获取数串
        String str = scanner.next();

        // 将输入的数串转成int[]
        char[] chars = str.toCharArray();
        int[] arr = new int[chars.length];
        for (int i = 0; i < chars.length; i++) {
            arr[i] = chars[i] - 48;
        }

        // 获得两字符串和数串的对应关系
        String s1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZZ";

        // 遍历arr
        StringBuilder sb = new StringBuilder();
        int index  = 0;
        for (int i = 0; i < arr.length; i++) {
            if (arr[i]>2){
                sb.append(s1.charAt(arr[i]-1));
            }else{
                sb.append(s1.charAt(arr[i]*10+arr[i+1]-1));
                i++;
            }
        }

        System.out.println(sb.toString());
    }
}

本套试题其它题目请点击…