package Java2020; public class 第三题 { public static void main(String[] args) { int sum = 10000; int min = 0; while (sum > 600) { sum = sum - 600; sum = sum + 300; min++; } System.out.println(min*2*60 + 40); } }
#D 合并检测
问题描述
新冠疫情由新冠病毒引起,最近在 A 国蔓延,为了尽快控制疫情,A 国准备给大量民众进病毒核酸检测。然而,用于检测的试剂盒紧缺。 为了解决这一困难,科学家想了一个办法:合并检测。即将从多个人(k个)采集的标本放到同一个试剂盒中进行检测。如果结果为阴性,则说明这 k个人都是阴性,用一个试剂盒完成了 k 个人的检测。如果结果为阳性,则说明至少有一个人为阳性,需要将这 k 个人的样本全部重新独立检测(从理论上看,如果检测前 k − 1 个人都是阴性可以推断出第 k 个人是阳性,但是在实际操作中不会利用此推断,而是将 k 个人独立检测),加上最开始的合并检测,一共使用了 k + 1 个试剂盒完成了 k 个人的检测。A 国估计被测的民众的感染率大概是 1%,呈均匀分布。请问 k 取多少能最节省试剂盒?
package Java2020; public class 第四题 { public static void main(String[] args) { int max = 10000, min = 0x7ffffff,res = 0; for (int i = 2; i int cnt = max / i + max / 100 * i + (max % i == 0? 0:1); if (cnt min = cnt; res = i; } } System.out.println(res); } }
#E REPEAT 程序
附件 prog.txt 中是一个用某种语言写的程序。 其中 REPEAT k 表示一个次数为 k 的循环。循环控制的范围由缩进表达,从次行开始连续的缩进比该行多的(前面的空白更长的)为循环包含的内容。 例如如下片段:
REPEAT 2: A = A + 4 REPEAT 5: REPEAT 6: A = A + 5 A = A + 7 A = A + 8 A = A + 9
该片段中从 A = A + 4 所在的行到 A = A + 8 所在的行都在第一行的循环两次中。REPEAT 6: 所在的行到 A = A + 7 所在的行都在 REPEAT 5: 循环中。A = A + 5 实际总共的循环次数是 2 × 5 × 6 = 60 次。请问该程序执行完毕之后,A 的值是多少?
package Java2020; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.security.KeyStore.Entry; import java.util.HashMap; import java.util.Map; import java.util.Scanner; public class 第五题 { public static void main(String[] args) throws FileNotFoundException { Scanner in = new Scanner(new FileInputStream("prog.txt")); Map map = new HashMap(); while (in.hasNext()) { String now = in.next(); Integer cnt = map.get(now); if (cnt == null) { map.put(now,1); }else { map.put(now, cnt+1); } for (java.util.Map.Entry e: map.entrySet()) { System.out.println(e.getKey()+": " + e.getValue()); } } } }
试题 F: 分类计数
【问题描述】
输入一个字符串,请输出这个字符串包含多少个大写字母,多少个小写字母,多少个数字。
【输入格式】
输入一行包含一个字符串。
【输出格式】
输出三行,每行一个整数,分别表示大写字母、小写字母和数字的个数。
【样例输入】
1+a=Aab
【样例输出】
1
3
1
package Java2020; import java.util.Scanner; public class 第六题 { public static void main(String[] args) { int number = 0; int capital = 0; int Lowletters = 0; Scanner sc = new Scanner(System.in); String str = sc.nextLine(); for (int i = 0; i char a = str.charAt(i); if (a >= '0' && a <= '9') { number++; }else if (a >= 'a' && a <= 'z') { capital++; }else if (a >= 'A' && a <= 'Z'){ Lowletters++; } } System.out.println(number); System.out.println(capital); System.out.println(Lowletters); } }
试题 G: 整除序列
【问题描述】
本题总分:15 分
有一个序列,序列的第一个数是 n,后面的每个数是前一个数整除 2,请输出这个序列中值为正数的项。
【输入格式】
输入一行包含一个整数 n。
【输出格式】
输出一行,包含多个整数,相邻的整数之间用一个空格分隔,表示答案。
【样例输入】
20
【样例输出】
20 10 5 2 1
【评测用例规模与约定】
对于 80% 的评测用例,1 ≤ n ≤ 109。
对于所有评测用例,1 ≤ n ≤ 1018。
package Java2020; import java.util.Scanner; public class 第七题 { public static void main(String[] args) { Scanner sc = new Scanner(System.in); long a = sc.nextLong();
while (a != 0) { a=a/2; if (a == 0) { break; } System.out.print(a+" "); } } }
试题 H: 走方格
本题总分:20 分
【问题描述】
在平面上有一些二维的点阵。这些点的编号就像二维数组的编号一样,从上到下依次为第 1 至第 n 行,从左到右依次为第 1 至第 m 列,每一个点可以用行号和列号来表示。现在有个人站在第 1 行第 1 列,要走到第 n 行第 m 列。只能向右或者向下走。注意,如果行号和列数都是偶数,不能走入这一格中。问有多少种方案。
【输入格式】
输入一行包含两个整数 n, m。
【输出格式】
输出一个整数,表示答案。
【样例输入】
3 4
【样例输出】
2
【样例输入】
6 6
【样例输出】
0
【评测用例规模与约定】
对于所有评测用例,1 ≤ n ≤ 30, 1 ≤ m ≤ 30。
package Java2020; import java.util.Scanner; public class 第八题 {
private static int m; private static int n; private static int sum;
public static void main(String[] args) { Scanner scanner = new Scanner(System.in); n = scanner.nextInt(); m = scanner.nextInt(); sum = 0; dfs(1,1);
System.out.println(sum); }
private static void dfs(int i, int j) { if (i>n||j>m) { return; } if (i%2 == 0 && j%2 == 0) { return; } if (i==n&&j==m) { sum++; return; } dfs(i+1,j); dfs(i,j+1); } }