1. 解密(5分)
问题描述
小明设计了一种文章加密的方法:对于每个字母 c,将它变成某个另外的字符 Tc。下表给出了字符变换的规则:
例如,将字符串 YeRi 加密可得字符串 EaFn。
小明有一个随机的字符串,加密后为EaFnjISplhFviDhwFbEjRjfIBBkRyY(由 30 个大小写英文字母组成,不包含换行符),请问原字符串是多少?
(如果你把以上字符串和表格复制到文本文件中,请务必检查复制的内容
是否与文档中的一致。在试题目录下有一个文件 str.txt,第一行为上面的字符
串,后面 52 行依次为表格中的内容。)
答案提交
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个
只包含 30 个大小写英文字母的字符串,在提交答案时只填写这个字符串,填写
多余的内容将无法得分。
答案:AyClthSohkCwnDkbCxAtFtchXXjFeE
2. 纪念日(5分)
2020 年 7 月 1 日是中国共产党成立 99 周年纪念日。
中国共产党成立于 1921 年 7 月 23 日。
请问从 1921 年 7 月 23 日中午 12 时到 2020 年 7 月 1 日中午 12 时一共包
含多少分钟?
答案:52,038,720
3. 合并检测(10分)
新冠疫情由新冠病毒引起,最近在 A 国蔓延,为了尽快控制疫情,A 国准
备给大量民众进病毒核酸检测。然而,用于检测的试剂盒紧缺。
为了解决这一困难,科学家想了一个办法:合并检测。即将从多个人(k
个)采集的标本放到同一个试剂盒中进行检测。如果结果为阴性,则说明这 k
个人都是阴性,用一个试剂盒完成了 k 个人的检测。如果结果为阳性,则说明
至少有一个人为阳性,需要将这 k 个人的样本全部重新独立检测(从理论上看,
如果检测前 k - 1 个人都是阴性可以推断出第 k 个人是阳性,但是在实际操作中
不会利用此推断,而是将 k 个人独立检测),加上最开始的合并检测,一共使用
了 k + 1 个试剂盒完成了 k 个人的检测。
A 国估计被测的民众的感染率大概是 1%,呈均匀分布。请问 k 取多少能
最节省试剂盒?
假设A国有n个人,感染者有n/100
每k个人一组,共n/k组,共用n/k瓶试剂 按照最坏的情况,每多出一个感染者就多用k瓶试剂, 因此共用n/k+(n/100)*k瓶试剂
n是定值,所以求(1/k+k/100)最小
由于a+b>=2√ab 当且仅当a = b时,取等号 即1/k=k/100时,取得最小值
解得k = 10
4. 分配口罩(10分)
问题描述
某市市长获得了若干批口罩,每一批口罩的数目如下:(如果你把以下文
字复制到文本文件中,请务必检查复制的内容是否与文档中的一致。在试题目
录下有一个文件 mask.txt,内容与下面的文本相同)
9090400
8499400
5926800
8547000
4958200
4422600
5751200
4175600
6309600
5865200
6604400
4635000
10663400
8087200
4554000
现在市长要把口罩分配给市内的 2 所医院。由于物流限制,每一批口罩只
能全部分配给其中一家医院。市长希望 2 所医院获得的口罩总数之差越小越好。
请你计算这个差最小是多少?
答案提交
这是一道结果填空题,你只需要算出结果后提交即可。本题的结果为一个
整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。
答案:2400
public class Main {
public static void main(String[] args) {
int sum = 0 , su = 0;
int[] nums = {
0, 9090400, 8499400, 5926800, 8547000, 4958200,
4422600, 5751200, 4175600, 6309600, 5865200, 6604400, 4635000,
10663400, 8087200, 4554000};
for (int i = 0; i < nums.length; i++) {
sum = sum + nums[i];
}
su = sum / 2;
int[] dp = new int[su+1];
for (int i = 1; i < nums.length; i++) {
for (int j = su; j >= nums[i]; j--) {
dp[j] = Math.max(dp[j] , dp[j-nums[i]] + nums[i]);
}
}
System.out.println(2 * (su - dp[su]));
}
}
5. 斐波那契数列最大公约数(15分)
斐波那契数列满足 F1 = F2 = 1,从 F3 开始有 F**n = F**nn 1 + F**nn 2。请你计算
GCD(F2020, F520),其中 GCD(A, B) 表示 A 和 B 的最大公约数。
答案:6765
package competition4;
import java.math.BigInteger;
public class BigNumber
{
public static void main(String[] args)
{
BigInteger a=new BigInteger("1");
BigInteger b=new BigInteger("1");
BigInteger[] fib=new BigInteger[2030];
fib[1]=a;
fib[2]=b;
for(int x=3;x<fib.length;x++)
{
fib[x]