每日省赛真题解析·第一天
每日省赛真题解析·第一天

每日省赛真题解析·第一天

目录

  • 2021省赛试题A
  • 2021省赛试题B
  • 2021省赛试题C

一.2021省赛试题A

题目链接:ASC – 蓝桥云课 (lanqiao.cn)

题目要求:

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

已知大写字母 A 的 ASCII 码为 65,请问大写字母 L 的 ASCII 码是多少?

解题思路:

很简单的一道ASCII码问题,签到题、送分题。L​​ 是英文字母表第12个, A​​ 的 ASCII码为 65​​,则 L 的 ASCII码为 65 + 11 = 76。

最终答案:76。

代码:

public class Main{
	public static void main(String[] args) {
		System.out.println('L' - 'A' + 65);
	}
}

二.2021省赛试题B

题目链接:卡片 – 蓝桥云课 (lanqiao.cn)

题目要求:

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

小蓝有很多数字卡片,每张卡片上都是数字 0 到 9。 小蓝准备用这些卡片来拼一些数,他想从 1 开始拼出正整数,每拼一个, 就保存起来,卡片就不能用来拼其它数了。 小蓝想知道自己能从 1 拼到多少。 例如,当小蓝有 30 张卡片,其中 0 到 9 各 3 张,则小蓝可以拼出 1 到 10, 但是拼 11 时卡片 1 已经只有一张了,不够拼出 11。 现在小蓝手里有 0 到 9 的卡片各 2021 张,共 20210 张,请问小蓝可以从 1 拼到多少? 提示:建议使用计算机编程解决问题。

解题思路:

比较容易的模拟,我们从 1 开始枚举, 每次检查剩下的卡片能不能拼出这个数字就好。我们是怎么把一个数在 10 进制下每个位置的数字求出来呢?很简单对吧,先对10取模,个位上的数字就求出来了,再除以 10 ,原本十位上的数字就变到了个位上,再对 10​​ 取模……依次进行下去就求出来了。把当前拼的这个数每一位都拆出来,看看那个数字的卡片还够不够,不够的话就说明拼不了,这时候退出循环,所以最多拼到上一个数。

最终答案:3181。

代码:

public class Main {
    static int[] num = {2021,2021,2021,2021,2021,2021,2021,2021,2021,2021};
    static int check(int x){
      while(x > 0){
          int now = x % 10;
          if(num[now] > 0) num[now]--;
          else return 0;
          x /= 10;
      }
      return 1;
    }
    public static void main(String[] args) {
        for(int i = 1;;i++){
           if(check(i) == 0){
                System.out.println(i - 1);
                break;
            }
        }
    }
}

三.2021省赛试题C

题目链接:暂无

题目要求:

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

在平面直角坐标系中,两点可以确定一条直线。如果有多点在一条直线上, 那么这些点中任意两点确定的直线是同一条。给定平面上 2 × 3 个整点{(x, y)|0 ≤ x < 2, 0 ≤ y < 3, x ∈ Z, y ∈ Z},即横坐标 是 0 到 1 (包含 0 和 1) 之间的整数、纵坐标是 0 到 2 (包含 0 和 2) 之间的整数 的点。这些点一共确定了 11 条不同的直线。

给定平面上 20 × 21 个整点 {(x, y)|0 ≤ x < 20, 0 ≤ y < 21, x ∈ Z, y ∈ Z},即横 坐标是 0 到 19 (包含 0 和 19) 之间的整数、纵坐标是 0 到 20 (包含 0 和 20​) 之 间的整数的点。请问这些点一共确定了多少条不同的直线。

解题思路:

在平面直角坐标系中,两点可以确定一条直线,那两个点有四个坐标值,我们不太好维护四个坐标值是否重复。我们知道直线的表示方式中,除了两点式,还有点斜式。点斜式的话, 一个点的两个坐标值和一个斜率值,三个值来确定唯一性,虽然不太好写但是还是勉强能跑出来。

更进一步,如果那个点是在 x 轴或者 y​ 轴上,那么一个坐标就恒定为 0, 只要维护另一个坐标值(其实就是截距)和斜率就好了,简单使用HashSet维护一下,注意枚举的斜率不存在的情况。

最后需要注意的是,直线的斜率和截距可能是小数,而小数在计算机中是有精度的,直接存小数,哪怕用double型也可能不准确,是非常危险的。所以我们使用整数来分别存储斜率和截距。

最终答案:40257。

代码:

import java.util.*;

public class Main {
    static int gcd(int a, int b) {
        return b == 0 ? a : gcd(b, a % b);
    }

    public static void main(String[] args) {
        Set<Integer> set = new HashSet<>();
        Set<String> ans = new HashSet<>();
        int x = 19, y = 20;
        for (int i = 0; i <= x; i++) {
            for (int j = 0; j <= y; j++) {
                set.add(i * 100 + j);
            }
        }
        List<Integer> arr = new ArrayList<>(set);
        int len = arr.size();
        for (int i = 0; i < len; i++) {
            int a = arr.get(i);
            for (int j = i + 1; j < len; j++) {
                int b = arr.get(j);
                int x1 = a / 100, x2 = b / 100, y1 = a % 100, y2 = b % 100;
                int up = y1 - y2, down = x1 - x2;
                int c1 = gcd(up, down);
                String K = (up / c1) + " " + (down / c1);
                if (down == 0) {
                    ans.add("x = " + x1);
                    continue;
                }
                int kx = up * x1, Y = y1 * down;
                int kb = Y - kx;
                int c2 = gcd(kb, down);
                String B = (kb / c2) + " " + (down / c2);
                ans.add(K + "  " + B);
            }
        }
        System.out.println(ans.size());
    }
}