2021蓝桥杯校级模拟赛习题答案&总结
程序员文章站
2022-07-03 12:06:43
...
写在前面
本次模拟赛习题难度比较常规,总的来说中规中举,对我这种小白都比较友好,填空题基本都可以直接算出来,除了最后两道编程题可能稍微需要花点时间,当然当时实在坐不住提前交卷了没能写完,欢迎大佬们评论区讨论指导,感激不尽。
下面是本次模拟赛习题
第一题
问题描述
请问在 1 到 2020 中,有多少个数与 2020 互质,即有多少个数与 2020 的最大公约数为 1。
答案
800
解题思路
直接暴力,遍历求解
第二题
问题描述
SCII 码将每个字符对应到一个数值(编码),用于信息的表示和传输。
在 ASCII 码中,英文字母是按从小到大的顺序依次编码的,
例如:字母 A 编码是 65, 字母 B 编码是 66,字母 C 编码是 67,请问字母 Q 编码是多少?
答案
81
第三题
问题描述
有一棵二叉树,一个由2021个结点,其中有1000个结点有两个子结点,其他的结点有一个或者0个子结点。
请问,这棵二叉树有多少个叶结点?
答案
1001
解题思路
当二叉树结点数为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
解题思路
直接找规律计算很快就能计算出。
第六题
问题描述
斐波那契数列是这样一个数列:它的第一项和第二项都是1,从第三项开始每一项都是前两项的和。
根据以上定义,我们容易计算出斐波那契数列的前几项依次是:1, 1, 2, 3, 5, 8, 13, 21, 34, 55 ……
现在请你计算斐波那契数列第N项是奇数还是偶数?
输入格式
输入的包含一个整数N。
输出格式
如果是奇数输出1,是偶数输出0。
样例输入
10
样例输出
1
提示
找规律。
数据规模和约定
对于所有评测用例,1 <= N <= 1000000000。
代码
方法① 常规写法,先计算斐波那契数列第N项,再判断是奇数还是偶数。
import java.util.Scanner;
public class Main{
public static int fib (int n) {
if (n <= 2) {
return 1;
}
else {
return (fib(n - 1) + fib (n - 2));
}
}
public static void main (String args[]) {
Scanner sc = new Scanner(System.in);
int a = sc.nextInt();
int b = fib(a);
if(b%2==0)
System.out.println("0");
else
System.out.println("1");
}
}
方法②,出来以后看到有大佬的另一种写法,顿时开悟,妙啊~ 现在把它分享过来
N给的范围很大,题目提示让找规律。N % 3 == 0 时为偶数,dp[i-2]是奇数,dp[i-1]是奇数,俩奇数相加一定是偶数。然后往后推一奇一偶相加是奇数,每三次一个T。
public void main(String args[]) {
Scanner scan = new Scanner(System.in);
long N = scan.nextLong();
int dp = N % 3 == 0 ? 0 : 1;
System.out.println(dp);
}
第七题
问题描述
在书写一个较大的整数时,为了方便看清数位,通常会在数位之间加上逗号来分割数位,具体的,从右向左,
每三位分成一段,相邻的段之间加一个逗号。
例如,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次方)。
代码
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.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());
}
}
第八题
问题描述
给定一个矩阵 M,由 n 行 m 列组成,第 i 行第 j 列值为 M[i][j]。
定义矩阵 M 的重量为矩阵中所有元素的和,几位weight(M)
请找到矩阵左上角的一个子矩阵S(矩阵的前 r 行中的前 c 列组成),
使得这个子矩阵的重量的两倍最接近矩阵 M 重量。即 |2 weight(S)-weight(M)| 最小。
如果有多个子矩阵满足条件,请找出面积 r * c 最小的一个。
如果仍然有多个子矩阵满足条件,请找出其中 r 最小的一个。
输入格式
输入第一行包含两个整数 n, m,表示矩阵的大小。
接下来 n 行,每行 m 个整数,表示给定的矩阵M。
输出格式
输出一行,包含两个整数 r, c,表示子矩阵为矩阵 M 的前 r 行中的前 c 列。
样例输入
3 4
3 0 1 1
1 0 1 1
1 1 -2 4
样例输出
2 3
数据规模和约定
对于 30% 的评测用例,1 <= n, m <= 20, -10 <= M[i][j] <= 10。
对于 50% 的评测用例,1 <= n, m <= 100, -100 <= M[i][j] <= 100。
对于所有评测用例,1 <= n, m <= 1000, -1000 <= M[i][j] <= 1000。
第九题
问题描述
杂货铺老板一共有N件物品,每件物品具有ABC三种属性中的一种或多种。
从杂货铺老板处购得一件物品需要支付相应的代价。
现在你需要计算出如何购买物品,可以使得ABC三种属性中的每一种都在至少一件购买的物品中出现,
并且支付的总代价最小。
输入格式
输入第一行包含一个整数N。
以下N行,每行包含一个整数C和一个只包含"ABC"的字符串,代表购得该物品的代价和其具有的属性。
输出格式
输出一个整数,代表最小的代价。如果无论如何凑不齐ABC三种属性,输出-1。
样例输入
5
10 A
9 BC
11 CA
4 A
5 B
样例输出
13
数据规模和约定
对于50%的评测用例,1 <= N <= 20
对于所有评测用例,1 <= N <= 1000, 1 <= C <= 100000
总结
最后两道题很遗憾当时最后没能写出来,希望各位能在评论区说说自己的想法,一起进步呀~
上一篇: python3生成微信带参数的小程序码
下一篇: 2020蓝桥杯模拟赛1 赛后总结