4. 蓝桥杯-第十一届JavaB组省赛真题
程序员文章站
2022-06-13 11:46:07
...
蓝桥杯-第十一届JavaB组7月5日省赛真题
1. 解密
问题描述:
- 小明设计了一种文章加密的方法:
对于每个字母 C,将它变成某个另外的字符 Tc
。下表给出了字符变换的规则:例如,将字符串 YeRi 加密可得字符串 EaFn。
- 小明有一个随机的字符串,加密后为
EaFnjISplhFviDhwFbEjRjfIBBkRyY
(由 30 个大小写英文字母组成,不包含换行符),请问原字符串是多少?(填空题5分)
答案:YeRikGSunlRzgDlvRwYkXkrGWWhXaA
/**
* @Date 2020/10/14 21:25
* @Version 10.21
* @Author DuanChaojie
*/
public class Main1 {
public static void main(String[] args) {
// 加密后的字符
String str = "EaFnjISplhFviDhwFbEjRjfIBBkRyY";
char[] arr = str.toCharArray();
// 原字符
String s1 = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
// 加密后的字符
String s2 = "yxmdacikntjhqlgoufszpwbrevYXMDACIKNTJHQLGOUFSZPWBREV";
// 遍历加密后的字符串
StringBuilder sb = new StringBuilder();
for (int i = 0; i < arr.length; i++) {
int index = s2.indexOf(arr[i]);
sb.append(s1.charAt(index));
}
// YeRikGSunlRzgDlvRwYkXkrGWWhXaA
System.out.println(sb.toString());
}
}
2. 纪念日
问题描述:
- 2020 年 7 月 1 日是中国*成立 99 周年纪念日。
- 中国*成立于 1921 年 7 月 23 日。
请问从 1921 年 7 月 23 日中午 12 时到 2020 年 7 月 1 日中午 12 时一共包含多少分钟?
填空题5分
答案:52038720
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* @Date 2020/10/14 21:34
* @Version 10.21
* @Author DuanChaojie
*/
public class Main2 {
public static void main(String[] args) {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
try {
Date date1 = format.parse("1921-07-23");
Date date2 = format.parse("2020-07-01");
// 获得相差的毫秒数
long date1Time = date1.getTime();
long date2Time = date2.getTime();
// 52038720
System.out.println((date2Time-date1Time)/(1000*60));
System.out.println("*********方法二**************");
main2();
} catch (ParseException e) {
e.printStackTrace();
}
}
public static void main2(){
/**
* 为什么要用21和120的原因
* int y = year + 1900;
*/
Date date1 = new Date(21, 7, 23, 12, 0, 0);
Date date2 = new Date(120, 7, 1, 12, 0, 0);
long date1Time = date1.getTime();
long date2Time = date2.getTime();
System.out.println((date2Time-date1Time)/(1000*60));
}
}
3. 合并检测
- 新冠疫情由新冠病毒引起,最近在 A 国蔓延,为了尽快控制疫情,A 国准备给大量民众进病毒核酸检测。然而,用于检测的试剂盒紧缺。为了解决这一困难,科学家想了一个办法:合并检测。即将从多个人(k个)采集的标本放到同一个试剂盒中进行检测。如果结果为阴性,则说明这 k个人都是阴性,用一个试剂盒完成了 k 个人的检测。如果结果为阳性,则说明至少有一个人为阳性,需要将这 k 个人的样本全部重新独立检测(从理论上看,如果检测前 k−1 个人都是阴性可以推断出第 k 个人是阳性,但是在实际操作中不会利用此推断,而是将 k 个人独立检测),加上最开始的合并检测,一共使用了 k + 1 个试剂盒完成了 k 个人的检测。
A 国估计被测的民众的感染率大概是 1%,呈均匀分布。请问 k 取多少能最节省试剂盒?
题解:
- 假设这个国家有n个人,这个我们n=10000000为常数(这里取一常数方便理解)。
- 感染的人有0.01n个人。
- 我们假设将人分组,k个人一组 。
- 需要的试剂的数量y是:
y = n / k + 0.01 ∗ n ∗ k y = n/k + 0.01*n*k y=n/k+0.01∗n∗k
- 对k进行求导的:
y ′ = − 1 ∗ ( n / k 2 ) + 0.01 ∗ n y' = -1*(n / k^2) + 0.01*n y′=−1∗(n/k2)+0.01∗n
- 要使y最小则:
( n / k 2 ) = 0.01 ∗ n (n / k^2) = 0.01*n (n/k2)=0.01∗n
- 得到结果k=10。
4. 分配口罩
问题描述:
某市市长获得了若干批口罩,每一批口罩的数目如下:(如果你把以下文字复制到文本文件中,请务必检查复制的内容是否与文档中的一致。在试题目录下有一个文件
mask.txt
,内容与下面的文本相同)9090400 8499400 5926800 8547000 4958200 4422600 5751200 4175600 6309600 5865200 6604400 4635000 10663400 8087200 4554000
现在市长要把口罩分配给市内的 2 所医院。由于物流限制,每一批口罩只能全部分配给其中一家医院。市长希望 2 所医院获得的口罩总数之差越小越好。请你计算这个差最小是多少?
填空题10分
2400
5. 斐波那契数列最大公约数
问题描述:
- 填空题15分
答案:6765
/**
* @Date 2020/10/15 0:23
* @Version 10.21
* @Author DuanChaojie
*/
public class Main5 {
public static void main(String[] args) {
// int long型数据均会爆数组
BigInteger[] arr = new BigInteger[2025];
// 注意下标为零值也为零
arr[0] = BigInteger.ZERO;
arr[1] = arr[2] = BigInteger.ONE;
for (int i = 3; i <= 2020; i++) {
arr[i] = arr[i-1].add(arr[i-2]);
}
// 这个值超过int的范围
System.out.println(arr[520]);
// 这个值超过了long的范围
System.out.println(arr[2020]);
BigInteger gcd = arr[2020].gcd(arr[520]);
System.out.println(gcd);
}
}
BigInteger gcd(BigInteger val) 返回大整数的最大公约数
public BigInteger gcd(BigInteger val) {
if (val.signum == 0)
return this.abs();
else if (this.signum == 0)
return val.abs();
MutableBigInteger a = new MutableBigInteger(this);
MutableBigInteger b = new MutableBigInteger(val);
MutableBigInteger result = a.hybridGCD(b);
return result.toBigInteger(1);
}
6. 分类计数
问题描述:
- 输入一个字符串,请输出这个字符串包含多少个大写字母,多少个小写字母,多少个数字。
输入格式:
- 输入一行包含一个字符串。
输出格式:
- 输出三行,每行一个整数,分别表示大写字母、小写字母和数字的个数。
样例输入 1+a=Aab 样例输出 1 3 1
对于所有评测用例,字符串由可见字符组成,长度不超过 100。
import java.util.Scanner;
/**
* @Date 2020/10/15 0:54
* @Version 10.21
* @Author DuanChaojie
*/
public class Main6 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
String str = scanner.next();
char[] chars = str.toCharArray();
int countAZ = 0;
int countaz = 0;
int countNum = 0;
// 遍历字符数组
for (int i = 0; i < chars.length; i++) {
if (chars[i] >= 'A' && chars[i] <= 'Z'){
countAZ++;
}
if (chars[i] >= 'a' && chars[i] <= 'z'){
countaz++;
}
if (chars[i] >= '0' && chars[i] <= '9'){
countNum++;
}
}
System.out.println(countAZ);
System.out.println(countaz);
System.out.println(countNum);
}
}
7. 八次求和
问题描述
给定正整数 n, 求 1 8 + 2 8 + ··· + n 8 mod 123456789 。其中 mod 表示取余
。输入格式
- 输入的第一行包含一个整数 n。
输出格式
- 输出一行,包含一个整数,表示答案。
样例输入 2 样例输出 257 样例输入 987654 样例输出 43636805
评测用例规模与约定:
- 对于 20% 的评测用例,1 ≤ n ≤ 20。
- 对于 60% 的评测用例,1 ≤ n ≤ 1000。
- 对于所有评测用例,1 ≤ n ≤ 1000000
import java.util.Scanner;
/**
* @Date 2020/10/15 1:02
* @Version 10.21
* @Author DuanChaojie
*/
public class Main7 {
private static long mod = 123456789;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
long sum = 0;
for (int i = 1; i <= n; i++) {
sum = (sum + getEight(i))%mod;
}
System.out.println(sum);
}
/**
* 计算 i 的八次方并返回
* @param i
*/
private static long getEight(int i) {
long result = i;
for (int j = 0; j < 7; j++) {
result = ((result%mod)*(i%mod)) % mod;
}
return result;
}
}
8. 字符串编码
问题描述:
- 小明发明了一种给由全大写字母组成的字符串编码的方法。对于每一个大写字母,小明将它转换成它在
26 个英文字母中序号,即 A → 1, B → 2, ... Z →26。
这样一个字符串就能被转化成一个数字序列:比如ABCXYZ → 123242526。
- 现在给定一个转换后的数字序列,小明想还原出原本的字符串。当然这样的还原有可能存在多个符合条件的字符串。小明希望找出其中字典序最大的字符串。
输入格式:
- 一个数字序列。
输出格式:
- 一个只包含大写字母的字符串,代表答案
样例输入 123242526 样例输出 LCXYZ
评测用例规模与约定:
对于 20% 的评测用例,输入的长度不超过 20。
对于所有评测用例,输入的长度不超过 200000。
import java.util.Scanner;
/**
* @Date 2020/10/15 1:09
* @Version 10.21
* @Author DuanChaojie
*/
public class Main8 {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
// 获取数串
String str = scanner.next();
// 将输入的数串转成int[]
char[] chars = str.toCharArray();
int[] arr = new int[chars.length];
for (int i = 0; i < chars.length; i++) {
arr[i] = chars[i] - 48;
}
// 获得两字符串和数串的对应关系
String s1 = "ABCDEFGHIJKLMNOPQRSTUVWXYZZ";
// 遍历arr
StringBuilder sb = new StringBuilder();
int index = 0;
for (int i = 0; i < arr.length; i++) {
if (arr[i]>2){
sb.append(s1.charAt(arr[i]-1));
}else{
sb.append(s1.charAt(arr[i]*10+arr[i+1]-1));
i++;
}
}
System.out.println(sb.toString());
}
}
☆
上一篇: 邻接矩阵:深度优先遍历和广度优先遍历