本题总分:10 分
【问题描述】
7 月 1 日是建党日,从 1921 年到 2020 年, 已经带领中国人民

走过了 99 年。
请计算:7 ^ 2020 mod 1921,其中 A mod B 表示 A 除以 B 的余数。
【答案提交】
这是一道 填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
参考代码如下:
package 第十一届蓝桥杯;import java.math.BigInteger;public class A指数计算 { public static void main(String[] args) { BigInteger num1 = new BigInteger("7"); BigInteger num2 = new BigInteger("1921"); BigInteger num3=num1.pow(2020).remainder(num2); System.out.println(num3); }}
试题 B: 跑步训练
本题总分:10 分
【问题描述】
小明要做一个跑步训练。
初始时,小明充满体力,体力值计为 10000。如果小明跑步,每分钟损耗600 的体力。如果小明休息,每分钟 增加 300 的体力。体力的损耗和增加都是均匀变化的。
小明打算跑一分钟、休息一分钟、再跑一分钟、再休息一分钟……如此循环。如果某个时刻小明的体力到达 0,他就停止锻炼。
请问小明在多久后停止锻炼。为了使答案为整数,请以秒为单位输出答案。
答案中只填写数字,不填写单位。
【答案提交】
这是一道 结果 填空题,你只需要算出结果后提交即可。本题的结果为一个
//参考代码package 第十一届蓝桥杯;public class B跑步训练 { public static void main(String[] args) { int target = 10000; int count = 0; boolean flag = true; while (true) { //如果小于600体力并且需要跑步,证明这一分钟跑不完 if (target < 600 && flag){ break; } if (flag) { target -= 600; flag = false; } else { target += 300; flag = true; } count++; }// System.out.println(count); //最后要求秒数,一分钟花费600体力,一秒花费10体力,体力除10就是剩下的跑步时间 int time = count 60+target/10; System.out.println(time); }}
试题 C: 合并检测
本题总分:10 分
【问题描述】
最近存在A病,最近在 A 国蔓延,为了尽快控制病,A 国准备给大量民众进病检测。
然而,用于检测的试剂盒紧缺。
为了解决这一困难,科学家想了一个办法:合并检测。即将从多个人(k个)采集的标本放到同一个试剂盒中进行检测。如果结果为阴性,则说明这 k个人都是阴性,用一个试剂盒完成了 k 个人的检测。如果结果为阳性,则说明至少有一个人为阳性,需要将这 k 个人的样本全部重新独立检测(从理论上看,如果检测前 k 1 个人都是阴性可以推断出第 k 个人是阳性,但是在实际操作中不会利用此推断,而是将 k 个人独立检测),加上最开始的合并检测,一共使用了 k + 1 个试剂盒完成了 k 个人的检测。
A 国估计被测的民众的感染率大概是 1%,呈均匀分布。请问 k 取多少能最节省试剂盒?
【答案提交】
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
试题 F: 分类计数
时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分
【问题描述】
输入一个字符串,请输出这个字符串包含多少个大写字母,多少个小写字
母,多少个数字。
【输入格式】
输入一行包含一个字符串。
【输出格式】
输出三行,每行一个整数,分别表示大写字母、小写字母和数字的个数。
【样例输入】
1+a=Aab
【样例输出】
1
3
1
【评测用例规模与约定】
对于所有评测用例,字符串由可见字符组成,长度不超过 100。
package 第十一届蓝桥杯;import java.util.Scanner;public class F分类计数 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.next(); sc.close(); char[] num = s.toCharArray(); int upp=0,low=0,nums=0; for (char c:num){ if(Character.isUpperCase(c)){ ++upp; } else if(Character.isLowerCase(c)){ ++low; } else if(Character.isDigit(c)){ ++nums; } } System.out.println(upp); System.out.println(low); System.out.println(nums); }}
试题 G: 整除序列
时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分
【问题描述】
有一个序列,序列的第一个数是 n,后面的每个数是前一个数整除 2,请输
出这个序列中值为正数的项。
【输入格式】
输入一行包含一个整数 n。
【输出格式】
输出一行,包含多个整数,相邻的整数之间用一个空格分隔,表示答案。
【样例输入】
20
【样例输出】
20 10 5 2 1
【评测用例规模与约定】
对于 80% 的评测用例,1 ≤ n ≤ 109。
对于所有评测用例,1 ≤ n ≤ 1018。
//参考代码package 第十一届蓝桥杯;import java.util.Scanner;public class G整除序列 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); sc.close(); while (n != 0) { System.out.print(n + " "); n = n >> 1;//等价于/2,位运算相对快一些 } }}
试题 H: 走方格
时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分
【问题描述】
在平面上有一些二维的点阵。
这些点的编号就像二维数组的编号一样,从上到下依次为第 1 至第 n 行,
从左到右依次为第 1 至第 m 列,每一个点可以用行号和列号来表示。
现在有个人站在第 1 行第 1 列,要走到第 n 行第 m 列。只能向右或者向下
走。
注意,如果行号和列数都是偶数,不能走入这一格中。
问有多少种方案。
【输入格式】
输入一行包含两个整数 n, m。
【输出格式】
输出一个整数,表示答案。
【样例输入】
3 4
【样例输出】
2
【样例输入】
6 6
【样例输出】
0
【评测用例规模与约定】
对于所有评测用例,1 ≤ n ≤ 30, 1 ≤ m ≤ 30。
package 第十一届蓝桥杯;import java.util.Scanner;public class H走方格 { public static void main(String[] args) { //输入矩阵的宽高 Scanner sc = new Scanner(System.in); int n = sc.nextInt(); int m = sc.nextInt(); sc.close(); int[][] dp = new int[n][m]; dp[0][0]=1; //这个规律是只能往右下走,也就是只能取左上的值 for (int i=0;i<n;i++){ for(int j=0;j<m;j++){ //第一行一列无需处理 if(i==0 && j==0){ continue; } //只要不是第一行就可以取上面的 if(i>0){ dp[i][j]+=dp[i-1][j]; } //只要不是第一列就可以取左面的 if(j>0){ dp[i][j]+=dp[i][j-1]; } //如果是偶数行列不能取值,这里是奇数,因为我的是从0开始,所以偶数的就变成了奇数 if((i&1)==1 && (j&1)==1){ dp[i][j]=0; } } } System.out.println(dp[n-1][m-1]); }}
试题 I: 字符串编码
时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分
【问题描述】
小明发明了一种给由全大写字母组成的字符串编码的方法。对于每一个大
写字母,小明将它转换成它在 26 个英文字母中序号,即 A → 1, B → 2, … Z →
26。
这样一个字符串就能被转化成一个数字序列:
比如 ABCXYZ → 123242526。
现在给定一个转换后的数字序列,小明想还原出原本的字符串。当然这样
的还原有可能存在多个符合条件的字符串。小明希望找出其中字典序最大的字
符串。
【输入格式】
一个数字序列。
【输出格式】
一个只包含大写字母的字符串,代表答案
【样例输入】
123242526
【样例输出】
LCXYZ
【评测用例规模与约定】
对于 20% 的评测用例,输入的长度不超过 20。
对于所有评测用例,输入的长度不超过 200000。
PS:
这个题我写复杂了,但是筛选条件就是这些,某些取反的情况可以少些很多if
//参考代码package 第十一届蓝桥杯;import java.util.Scanner;public class I字符串编码 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String s = sc.next(); sc.close(); StringBuilder sb = new StringBuilder(); int len = s.length(); char[] num = s.toCharArray(); for (int i = 0; i < len; i++) { //1开头 if (num[i] == '1') { //第i+2位是否为0,如果为0,当前位就不能和i+1位合并成一个字母 if (i < len - 2) { //不为0 if (num[i + 2] != '0') {// System.out.println((num[i]-'0') 10 + num[i + 1] + 'A' -1 -'0' ); sb.append((char) ((num[i] - '0') 10 + num[i + 1] + 'A' - 1 - '0')); ++i; // 为0,当前位就不能和i+1位合并成一个字母,(如果合成字母,剩下一个0没办法转换) } else { sb.append((char) (num[i] - '0' + 'A' - 1)); } //i+2已超过尽头 } else { //看i+1位是否存在 if (i < len - 1) { sb.append((char) ((num[i] - '0') 10 + num[i + 1] + 'A' - 1 - '0')); //不存在,第i位为最后一位 } else { sb.append((char) (num[i] - '0' + 'A' - 1)); } break; } //2开头 } else if (num[i] == '2') { //看存不存在下一位 if (i < len - 1) { //看下一位是不是小于6,因为字母的大小不能超过26 if (num[i + 1] <= '6') { //看第i+2位是否存在 if (i < len - 2) { //看第i+2位是否=0 if (num[i + 2] != '0') { sb.append((char) ((num[i] - '0') 10 + num[i + 1] + 'A' - 1 - '0')); ++i; // 为0,当前位就不能和i+1位合并成一个字母,(如果合成字母,剩下一个0没办法转换) } else { sb.append((char) (num[i] - '0' + 'A' - 1)); } //不存在的话,就直接添加就行 } else { sb.append((char) ((num[i] - '0') 10 + num[i + 1] + 'A' - 1 - '0')); break; } //如果大于6,证明不能和后一位合并 } else { sb.append((char) (num[i] - '0' + 'A' - 1)); } //不存在下一位,这一位就直接放进去 } else { sb.append((char) (num[i] - '0' + 'A' - 1)); } //如果大于2的话,就直接添加就行,字母没有2以上开头的 } else { sb.append((char) (num[i] - '0' + 'A' - 1)); } } System.out.println(sb.toString()); } public static char getUppLetter(int num) { System.out.println((char) (num)); return (char) (num); }}