蓝桥杯年2021年Java大学B组省赛真题

下文为蓝桥杯年2021年Java大学B组省赛真题

01-直线

枚举 + 平面几何,难度中等,坑点很多,重点理解直线表示的斜截式

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;

/**
 * https://www.lanqiao.cn/courses/5493/learning/?id=252014
 * 代码没调通
 */
public class T01Line {

    // 辗转相除法求最大公约数
    static int gcd(int a, int b) {
        // (b, a%b) => a,b的大小无所谓
        return gcd(b, a % b);
    }


    public static void main(String[] args) {
        // 存放点(高两位存放x,低两位存放y) || 1256 => x = 12; y = 56
        HashSet<Integer> set = new HashSet<>();
        int X = 19;
        int Y = 20;
        for (int i = 0; i < X; i++) {
            for (int j = 0; j < Y; j++) {
                set.add(i * 100 + j);
            }
        }

        // 存放答案的集合(使用set去重)
        HashSet<String> ans = new HashSet<>();

        // 因为set没有get方法
        List<Integer> arr = new ArrayList<>(set);
        int len = arr.size();
        // 遍历每一个点
        for (int i = 0; i < len; i++) {
            // 获取一个顶点a
            int a = arr.get(i);
            
            // 遍历除a表示的点之外的点
            for (int j = i + 1; j < len; j++) {
                // 获取另一个顶点b
                int b = arr.get(j);
                int y1 = a / 100, y2 = b / 100, x1 = a % 100, x2 = b % 100;
                // 斜截式: y = (y2-y1)/(x2-x1) + b
                // up = y2 - y1;    down = x2 - x1;
                // 斜率: k = (y2-y1)/(x2-x1) = up/down
                // 参数: b = {y1*(x2-x1)-(y2-y1))*x1}/down = (y1*down-up*x1)/down
                int up = y2 - y1;
                int down = x2 - x1;

                if (down == 0){
                    // down = 0代表着k=0,所以斜线为:y1 = 0 + x1
                    ans.add("x = " + x1);
                    continue;
                }

                // 求up, down的最大公约数
                int C1 = gcd(up, down);
                String K = (up / C1) + " " + (down / C1);


                int kb = y1 * down - up *x1;

                // 求(y1*down-up*x1)、down的最大公约数
                int C2 = gcd(up, down);
                String B = (kb / C2) + " " + (down / C2);
                ans.add(K + " " + B);
            }
        }
        System.out.println(ans.size());
    }
}

02-ASCII

送分题,有一点计算机字符基础就能算出来

/**
 * https://www.lanqiao.cn/courses/5493/learning/?id=252011
 */
public class T02ASC {
    public static void main(String[] args) {
        System.out.println(65 + ('L'-'A'));
    }
}

03-卡片

暴力穷举,简单题

import java.util.HashMap;
import java.util.Scanner;

/**
 * https://www.lanqiao.cn/courses/5493/learning/?id=252013
 */
public class T03Card {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        HashMap<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i <= 9; i++) {
            map.put( i, 2021);
        }

        // 终止标志:true 终止
        boolean flag = false;

        // 上限 20210
        for (int i = 0; i < 20210; i++) {
            String s = String.valueOf(i);
            for (int j = 0; j < s.length(); j++) {
                int n = s.charAt(j) - '0';
                int cnt = map.get(n);
                if(cnt > 0){
                    map.put(n, cnt - 1);
                }else{
                    System.out.println(i);
                    flag = true;
                    break;
                }
            }
            if (flag){
                break;
            }
        }
        scan.close();
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值