第十四届蓝桥杯三月真题刷题训练——第 11 天

目录

第 1 题:卡片

题目描述

运行限制

第 2 题:路径_dp+gcd

运行限制

第 3 题:字符统计

问题描述

输入格式

输出格式

样例输入

样例输出

评测用例规模与约定

运行限制

第 4 题:费用报销  


第 1 题:卡片

题目描述

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小蓝有很多数字卡片,每张卡片上都是数字 0 到 9。

小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个,就保存起来,卡片就不能用来拼其它数了。

小蓝想知道自己能从 1 拼到多少。

例如,当小蓝有 30 张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10,

但是拼 11 时卡片 1 已经只有一张了,不够拼出11。

现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 1 拼到多少?

提示:建议使用计算机编程解决问题。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

代码:

package 第十四届蓝桥杯三月真题刷题训练.day11;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StreamTokenizer;
import java.util.Arrays;

/**
 * @author yx
 * @date 2023-03-14 8:28
 */
public class 卡片 {
    static PrintWriter out =new PrintWriter(System.out);
    static BufferedReader ins=new BufferedReader(new InputStreamReader(System.in));
    static StreamTokenizer in=new StreamTokenizer(ins);
    /**
     * 输入
     * in.nextToken()
     * int a= (int)in.nval;
     *
     * 输出
     * out.print();
     * out.flush();
     */
    static int[] nums=new int[10];
    static int i;
    public static void main(String[] args) {
        i=0;
        while (true){
            i++;
            char[] num=(i+"").toCharArray();
            int length=num.length;
            for (int j = 0; j < length; j++) {
                nums[num[j] - '0']++;
                if(nums[num[j]-'0']==2021&&j==length-1) {
                    out.println(i);
                    out.flush();
                    return;
                }else if(nums[num[j]-'0']==2021&&j!=length-1){
                    out.println(i-1);
                    out.flush();
                    return;
                }
            }
        }
    }
}

第 2 题:路径_dp+gcd

本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。

小蓝学习了最短路径之后特别高兴,他定义了一个特别的图,希望找到图 中的最短路径。

小蓝的图由 2021 个结点组成,依次编号 1 至 2021。

对于两个不同的结点 a, b,如果 a 和 b 的差的绝对值大于 21,则两个结点 之间没有边相连;如果 a 和 b 的差的绝对值小于等于 21,则两个点之间有一条 长度为 a 和 b 的最小公倍数的无向边相连。

例如:结点 1 和结点 23 之间没有边相连;结点 3 和结点 24 之间有一条无 向边,长度为 24;结点 15 和结点 25 之间有一条无向边,长度为 75。

请计算,结点 1 和结点 2021 之间的最短路径长度是多少。

提示:建议使用计算机编程解决问题。

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 128M

代码:

package 第十四届蓝桥杯三月真题刷题训练.day11;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.io.StreamTokenizer;

/**
 * @author yx
 * @date 2023-03-14 8:54
 */
public class 路径_01背包_gcd {
    static PrintWriter out = new PrintWriter(System.out);
    static BufferedReader ins = new BufferedReader(new InputStreamReader(System.in));
    static StreamTokenizer in = new StreamTokenizer(ins);

    /**
     * 输入
     * in.nextToken()
     * int a= (int)in.nval;
     *
     * 输出
     * out.print();
     * out.flush();
     */
    public static void main(String[] args) {
        int[] nums = new int[2022];
        for (int i = 1; i <= 2021; i++) {
            //这个地方也比较细节,到i+21时为最大更新区间
            for (int j = i+1; j <=i+21 ; j++) {
                if (j == 2022) {
                    //当遍历到2022时,说明在此循环内已经完成了2021之前的更新
                    //2022超出最大范围2021,所以退出当前循环
                    //继续下一个i+1,更新从i+1~2021的最小路径
                    break;
                }
                //i*j的最小公倍数等于(i*j)/最大公约数
                int temp = gcd(i, j);
                if (nums[j] == 0) {//初始化
                    nums[j] = (int)(i * j / temp) + nums[i];
                } else {//进行最优化迭代,选出最短路径
                    nums[j] = Math.min(nums[j], i * j / temp + nums[i]);
                }
            }
        }
        out.println(nums[2021]);
        out.flush();
    }

    static int gcd(int m, int n) {
        return n != 0 ? gcd(n, m % n) : m;
    }
}

第 3 题:字符统计

问题描述

给定一个只包含大写字母的字符串 S, 请你输出其中出现次数最多的字符。如果有多个字母均出现了最多次, 按字母表顺序依次输出所有这些字母。

输入格式

一个只包含大写字母的字符串 S.

输出格式

若干个大写字母,代表答案。

样例输入

BABBACAC

样例输出

AB

评测用例规模与约定

对于 100%的评测用例, 1≤∣S∣≤10^6.

运行限制

  • 最大运行时间:1s
  • 最大运行内存: 512M

代码:

package 第十四届蓝桥杯三月真题刷题训练.day11;

import java.io.*;
import java.util.Arrays;
import java.util.HashMap;

/**
 * @author yx
 * @date 2023-03-14 9:53
 */
public class 字符统计 {
    static PrintWriter out =new PrintWriter(System.out);
    static BufferedReader ins=new BufferedReader(new InputStreamReader(System.in));
    static StreamTokenizer in=new StreamTokenizer(ins);
    /**
     * 输入
     * in.nextToken()
     * int a= (int)in.nval;
     *
     * 输出
     * out.print();
     * out.flush();
     */
    public static void main(String[] args) throws IOException {
        char[] strings=ins.readLine().toCharArray();
        int length1=strings.length;
        int max=0;
        int[] nums1=new int[26];
        for (int i = 0; i < length1; i++) {
            nums1[strings[i]-'A']++;
        }
        int length2=nums1.length;
        int[]nums2= Arrays.copyOf(nums1,nums1.length);
        Arrays.sort(nums1);
        max=nums1[25];
        for (int i = 0; i < length2; i++) {
            if(nums2[i]==max){
                System.out.print((char)('A'+i));
            }
        }
    }
}

第 4 题:费用报销  

晚上补题

猜你喜欢

转载自blog.csdn.net/m0_55858611/article/details/129516581