第十二届蓝桥杯模拟赛(第三期)

本文介绍了第十二届蓝桥杯模拟赛第三期的解题思路,涵盖动态规划、数据结构等多个算法问题。包括与2020互质数个数的计算、ASCII码查询、二叉树叶节点数量、Pierce序列长度、Excel列名推导、整数分隔符添加、斐波那契数列奇偶性判断、最合适的子矩阵下标选择、购买物品最小代价的全组合问题以及长度为k的上升子序列个数的计算。每个问题都提供了详细的解题过程和答案。
摘要由CSDN通过智能技术生成


Tips

 没有收藏题目的可以看看题目,我哪个做错了及时指出来啊,谢谢大家了。(我的解题思路超烂)


第一题

问题描述

 请问在 1 到 2020 中,有多少个数与 2020 互质,即有多少个数与 2020 的最大公约数为 1。

答案
800


解题思路

​  可以暴力,从1到2019遍历一下。

​  2020能被质数 2、5、101整除,遍历从1到2020有多少数是2,5,101的倍数,得到与2020不互为质数的数的个数,为1220,2020 - 1220 = 800。


第二题

问题描述

 ASCII 码将每个字符对应到一个数值(编码),用于信息的表示和传输。在 ASCII 码中,英文字母是按从小到大的顺序依次编码的,例如:字母 A 编码是 65, 字母 B 编码是 66,字母 C 编码是 67,请问字母 Q 编码是多少?

答案
81


第三题

问题描述

 有一棵二叉树,一个由2021个结点,其中有1000个结点有两个子结点,其他的结点有一个或者0个子结点。
 请问,这棵二叉树有多少个叶结点?

答案
1001


解题思路

​  二叉树叶子结点 等于 有两个子结点的结点数+1。

​  当二叉树结点数为 2021 时,有 2020 条树枝,有两个子结点的结点数对应两个树枝,有一个子结点的结点数对应一个树枝,那么当有 2021 个结点,有 2020 个树枝,其中有 1000 个结点有两个子结点,就对应 2000 个树枝,还剩 2020-2000 = 20 个树枝留给有一个子结点的结点数,就是 2021 - 1000 - 20 = 1001 个叶子结点。


第四题

问题描述

 对于整数 v 和 p,定义 Pierce 序列为:
  a[1] = v
  a[i] = p % a[i-1]
  例如,当 v = 8, p = 21 时,对应的 Pierce 序列为
  a[1] = 8
  a[2] = 5
  a[3] = 1
  再往后计算,值变为 0,不在我们考虑的范围内。因此当 v = 8, p = 21 时, Pierce 序列的长度为 3。
  当 p 一定时,对于不同的 v 值,Pierce 序列的长度可能不同。当 p = 8 时,若 1<=v<p,最长的 Pierce 序列出现在 v=13时,为(13, 8, 5, 1),长度为 4。
  当 p=2021 时,最长的 Pierce 序列出现在 v=1160 时,请问这个序列有多长?

答案
12


第五题

问题描述

 在 Excel 中,第 1 列到第 26 列的列名依次为 A 到 Z,从第 27 列开始,列名有两个字母组成,第 27 列到第 702 列的列名依次为 AA 到 ZZ。
  之后的列再用 3 个字母、4 个字母表示。
  请问,第 2021 列的列名是什么?

答案
BYS


解题思路

​  题目只说两个字母组成时是从AA到ZZ,没给按什么顺序或规则,是左侧还是右侧的字母优先,但是按照常理说AA下一个应该是AB。

public void method05() {
   
    int a = 26;
    int b = a * a;
    int dp = 2021 - a - b;
    int count = 0;
    for(int i = 0; i < 26; i++) {
   
        for(int j = 0; j < 26; j++) {
   
            for(int k = 0; k < 26; k++) {
   
                count++;
                if(count == dp) {
   
                    char c1 = (char)(i + 'A');
                    char c2 = (char)(j + 'A');
                    char c3 = (char)(k + 'A');
                    StringBuilder sb = new StringBuilder();
                    sb.append(c1);
                    sb.append(c2);
                    sb.append(c3);
                    System.out.println(sb.toString());
                }
            }
        }
    }
}


第六题

问题描述

 在书写一个较大的整数时,为了方便看清数位,通常会在数位之间加上逗号来分割数位,具体的,从右向左,每三位分成一段,相邻的段之间加一个逗号。
 例如,1234567 写成 1,234,567。
 例如,17179869184 写成 17,179,869,184。
 给定一个整数,请将这个整数增加分割符后输出。
输入格式
 输入一行包含一个整数 v。
输出格式
 输出增加分割符后的整数。

样例输入
1234567
样例输出
1,234,567
样例输入
17179869184
样例输出
17,179,869,184
数据规模和约定
 对于 50% 的评测用例,0 <= v < 10^9 (10的9次方)。
 对于所有评测用例,0 <= v < 10^18 (10的18次方)。

解题思路
public void method06() {
   
    Scanner scanner = new Scanner(System.in);
    long n = scanner.nextLong();
    StringBuilder sb = new StringBuilder();
    if(n == 0) {
   
        System.out.println(sb.append(0).toString());
        return;
    }

    int count = 0;
    while(n > 0) {
   
        sb.insert(0,n % 10);
        count ++;
        if(n >= 10 && count > 0 && count % 3 == 0)
            sb.insert(0,',');
        n /= 10;
    }
    System.out.println(sb.toString());
}


第七题

问题描述

 斐波那契数列是这样一个数列:它的第一项和第二项都是1,从第三项开始每一项都是前两项的和。

评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值