2021 第十二届 蓝桥杯省赛第一场 JAVA 大学 B 组

小贴士:本文字数6千,粗读约需5分钟,精读约需30分钟


观点

今年的省赛和以前有点区别,更重视数学,算法,思想了,有点往ACM靠拢,相信这是一个趋势,以后的蓝桥杯将会更重视思维


提示:题目光看不练是不行的,建议打开IDE自己实现一波!!!

A. 字母

题目:字母A的ASCLL码值表示为65,那么字母L转换成ASCLL码值是多少

解题思路
方法一:直接从A(65)开始数到L(76)
方法二:java程序字符L强制转换成int

输出答案:76
代码如下(示例):

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

B. 卡片

在这里插入图片描述

解题思路
方法一:直接利用hashmap模拟即可

输出答案:3181
代码如下(示例):


import java.util.HashMap;

public class B卡片 {
    /***
     用map记录卡片数量,每个数字拆开来减1
     */
    public static void main(String[] args) {
        HashMap<Integer,Integer> map = new HashMap<>();
        map.put(0,2021);
        map.put(1,2021);
        map.put(2,2021);
        map.put(3,2021);
        map.put(4,2021);
        map.put(5,2021);
        map.put(6,2021);
        map.put(7,2021);
        map.put(8,2021);
        map.put(9,2021);
        int i=1;
        for (;; i++) {

            boolean flag = false;
            int num = i;
            while (true){
                int temp = num%10;
                if (map.get(temp)<=0){
                    flag = true;
                    break;
                }
                map.put(temp,map.get(temp)-1);
                num = num/10;
                if (num==0){

                    break;
                }
            }
            if (flag)break;;

        }

        System.out.println(i-1);
    }
}


C. 直线

在这里插入图片描述

解题思路
方法一:两点确定一条直线,用直线确定方程的一般式子ax+by+c=0,求出所有的三元组(a,b,c),再去重

输出答案:40257


D. 货物摆放

在这里插入图片描述

解题思路
方法一:排列组合题,直接固定一个数,求另外两位数的组合即可
ps:
数据量大,数据类型用long

输出答案:2430


E. 路径

在这里插入图片描述

解题思路
方法一:用最小公倍数创建图的权值,再用floyd算法计算最短路径

输出答案:10266837
代码如下(示例):


public class E路径 {

    public static void main(String[] args) {
        int gragh[][] = new int[2050][2050];
        int n = 2021;
        for (int i = 1; i <= n; i++) {
            gragh[i][i] = 0;
            for (int j = i + 1; j <= i + 21; j++) {
                gragh[i][j] = gragh[j][i] = lcm(i, j);

            }
        }

        for (int k = 1; k <= n; k++) {
            for (int i = 1; i <= n; i++) {
                for (int j = 1; j <= n; j++) {
                    if (gragh[i][k] + gragh[k][j] < gragh[i][j]) {
                        gragh[i][j] = gragh[i][k] + gragh[k][j];
                    }
                }
            }
        }

        System.out.println(gragh[1][n]);

    }

    private static int lcm(int i, int j) {
        return i / gcd(i, j) * j;
    }

    private static int gcd(int i, int j) {
        return j == 0 ? i : gcd(j, i % j);
    }
}


F. 时间显示

在这里插入图片描述

解题思路
方法一:模拟法,去掉天,取余算出小时,分钟,和秒

代码如下(示例):

import java.util.Scanner;

public class F时间显示 {
    /***
     模拟
     */
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        long n = sc.nextLong();
        n/=1000;
        int res = (int) (n % (24*60*60)); //最后一天
        int h = res/3600;
        res %= 3600;
        int m = res / 60;
        res%=60;
        System.out.println(h+":"+m+":"+res);//String.Format格式化一下就好

    }
}


G. 砝码称重

在这里插入图片描述

解题思路
方法一:这题是01背包的变形;


H. 杨辉三角形

在这里插入图片描述

解题思路
方法一:当时模拟杨辉三角形再暴力匹配的,思路代码都比较简单,但是只能骗点分…


I. 双向排序

在这里插入图片描述

解题思路
方法一:完全是暴力骗分了,直接用sort排序的,有更好的做法可以评论留言…



J. 括号序列

在这里插入图片描述

解题思路
方法一:dfs暴力骗分,枚举所有可能的结果,再判断是否可以通过插入最少个数得到,是的话就count++;最后的count即是答案
代码如下(示例):



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

public class J括号序列 {
    /***
     dfs暴力骗分
     ()()()

     这个set容器可以不需要,直接在dfs中计数,count设置为全局变量
     */
    static Set<String> set = new HashSet<>();

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        String s = sc.next();
        int left = 0;
        int right = 0;
        for (int i = 0; i < s.length(); i++) {
            if (s.charAt(i) == '(') {
                left++;
            } else {
                right++;
            }
        }
        //int count = Math.max(left, right);
        int count;//最多的括号数量
        int sub;//插入的括号不能超过sub个,也就是不一样的括号数量
        if (left > right) {
            count = left;
            sub = left - right;
        } else {
            count = right;
            sub = right - left;
        }

        String temp = "";
        for (int i = 0; i < count; i++) {
            temp += "()";
        }
        dfs(temp);
        System.out.println(set);

        int resCount = 0;

        for (String s1 : set) {
            int i = 0;
            int j = 0;
            boolean isMatch = true;
            while (i < s.length() && j < s1.length()) {
                int tempCount = sub;
                if (s.charAt(i) == s1.charAt(j)) {
                    i++;
                    j++;
                } else {
                    j++;
                    tempCount--;
                }
                if (tempCount < 0) {
                    isMatch = false;
                    break;
                }
            }
            if (isMatch) {
                resCount++;
            }
        }

        System.out.println(resCount);
    }

    private static void dfs(String temp) {
        set.add(temp);
        for (int i = 0; i < temp.length() - 1; i++) {
            if (temp.charAt(i) == ')' && temp.charAt(i + 1) == '(') {
                String temps = temp.substring(0, i) + "()" + temp.substring(i + 2, temp.length());
                dfs(temps);
            }
        }
    }
}


总结

要想更好的提升算法能力,归根结底还是要多刷题,分类刷题
如果大家有更好的思路和解法,希望能评论区分享一波

  • 9
    点赞
  • 56
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
第十一届蓝桥杯省赛第二场java大学b真题共分为两道编程题和一道综合应用题,以下是真题及解析。 第一题是给定一个字符串,求出字符串中所有数字的总和。首先我们可以使用正则表达式来匹配字符串中的数字,然后将匹配到的数字累加起来即可。可以使用Java中的Pattern和Matcher类来实现正则匹配,具体代码如下: ```java import java.util.regex.*; public class Main { public static void main(String[] args) { String str = "abc123def456ghi789"; int sum = 0; Pattern pattern = Pattern.compile("\\d+"); Matcher matcher = pattern.matcher(str); while(matcher.find()) { sum += Integer.parseInt(matcher.group()); } System.out.println("数字总和为:" + sum); } } ``` 第二题是给定两个字符串,判断第二个字符串是否是第一个字符串的子串。可以使用Java中的contains()方法来判断一个字符串是否包含另一个字符串。具体代码如下: ```java public class Main { public static void main(String[] args) { String str1 = "abcdefg"; String str2 = "cde"; if (str1.contains(str2)) { System.out.println("第二个字符串是第一个字符串的子串!"); } else { System.out.println("第二个字符串不是第一个字符串的子串!"); } } } ``` 综合应用题是实现一个简单的计算器,根据输入的两个数字和运算符进行相应的运算并输出结果。我们可以使用Java中的Scanner类来获取用户输入的数字和运算符,并根据运算符进行相应的运算。具体代码如下: ```java import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("请输入第一个数字:"); int num1 = scanner.nextInt(); System.out.print("请输入第二个数字:"); int num2 = scanner.nextInt(); System.out.print("请输入运算符(+、-、*、/):"); String operator = scanner.next(); double result = 0; switch(operator) { case "+": result = num1 + num2; break; case "-": result = num1 - num2; break; case "*": result = num1 * num2; break; case "/": result = num1 / num2; break; default: System.out.println("无效的运算符!"); } System.out.println("计算结果为:" + result); } } ``` 以上就是第十一届蓝桥杯省赛第二场java大学b真题及解析的回答,希望能对你有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值