2019年第一届全国高校计算机能力挑战赛区域赛
第二套试卷
编程的个人解答源码及思路
1.某星球存在两种生物,A 种生物有 1 个头 6 条腿,B 种生物有 3 个头 4 条腿。来自地球的太空船刚刚在该星球降落,突然发现一大群这两种生物组成的队伍,由于时间紧,只数了头的数量和腿的数量,请帮助宇航员分析 A、B 两种生物各有多少个。
输入说明:头的数量L 腿的数量Z(L,Z<=100000);
输出说明:A生物的数量 B生物的数量(两个整数用一个空格隔开);
输入样例:
10 32
输出样例:
4 2
参考源码:
1. import java.util.Scanner;
2. public class FirstProblemPreliminary {
3. public static void main(String[] args) {
4. Scanner input = new Scanner(System.in);
5. long A,B,L,Z;
6. L=input.nextInt();
7. Z=input.nextInt();
8. A=(3*Z-4*L)/14;
9. B=(6*L-Z)/14;
10. System.out.println(A+" "+B);
11. }
12. }
算法思路:
二元一次方程组,A+3B=L/6A+4B=Z,分别对A和B进行消元。
运行截图:
运行实例1(题目上的测试用例)
运行实例2
2.对于给出的长度为 N(N<1000)的正整数数组,满足连续 3 个元素均为合数的区间称为 3 合数区间,计算该数组中 3 合数区间的个数。
输入说明:第一行,数组中元素个数 N,第二行,N 个正整数,用空格隔开。
输出说明:3合数区间的个数
输入样例:
7
6 8 4 9 7 5 8
输出样例:
2
参考源码:
1. import java.util.Scanner;
2. public class SecondProblemPreliminary {
3. public static void main(String[] args) {
4. Scanner input = new Scanner(System.in);
5. int n = input.nextInt();
6. int[] data = new int[n];
7. for (int i = 0; i < n; i++) {
8. data[i] = input.nextInt();
9. }
10. int count = 0;
11. for (int i = 0; i < n - 2; i++) {
12. boolean flag1 = isCompositeNumbe(data[i]);
13. boolean flag2 = isCompositeNumbe(data[i + 1]);
14. boolean flag3 = isCompositeNumbe(data[i + 2]);
15. if (flag1 && flag2 && flag3) {
16. count = count + 1;
17. }
18. }
19. System.out.println(count);
20. }
21. private static boolean isCompositeNumbe(int oneData) {
22. for (int i = 2; i < oneData; i++) {
23. if (oneData % i == 0) {
24. return true;
25. }
26. }
27. return false;
28. }
29. }
算法思路:
模拟算法,主要边界条件。
运行截图:
运行实例1(题目上的测试用例)
运行实例2(数组元素个数小于3)
运行实例3(2是素数)
3.给定两个字符串,均只包含英文字母,需区分大小写,一个是源字符串 SS(长度 < 1000),另一个是目标字符串 TS(长度 < 1000),请问能否通过删除 SS 中的字符(不改变顺序)将它变换成 TS,如果可以输出 “YES”,不可以则输出 “NO”。
输入说明:第一行为源字符串 SS,第二行为目标字符串 TS。
输出说明:可以输出 “YES”,不可以输出 “NO”。
输入样例 1:
Thereisacomputer
Treat
输出样例 1:
YES
输入样例 2:
Thereisacomputer
Trait
输出样例 2:
NO
参考源码:
1. import java.util.ArrayList;
2. import java.util.Scanner;
3. public class ThirdProblemPreliminary {
4. public static void main(String[] args) {
5. Scanner input = new Scanner(System.in);
6. ArrayList slist = new ArrayList<>();
7. String strs = input.nextLine();
8. String dtrs = input.nextLine();
9. char[] scharArray = strs.toCharArray();
10. char[] dcharArray = dtrs.toCharArray();
11. for (int i = 0; i < scharArray.length; i++) {
12. slist.add(scharArray[i]);
13. }
14. int index = 0;
15. for (int i = 0; i < slist.size(); i++) {
16. if (index >= dcharArray.length) {
17. break;
18. }
19. if (slist.get(i) != dcharArray[index]) {
20. slist.remove(i--);
21. } else {
22. index++;
23. }
24. }
25. if (slist.size() >= dcharArray.length) {
26. System.out.println("YES");
27. } else {
28. System.out.println("NO");
29. }
30. }
31. }
算法思路:
模拟算法。
运行截图:
运行实例1(题目上的测试用例)
运行实例2(题目上的测试用例)
运行实例3(SS=TS)
4.数字连连看,给出一个整数数组和一个目标值,请在数组中找到三个元素,它们的和为该目标值。
输入说明:第一行是整数 N 和 T,N(N<10000)表示整数数组中元素个数,T 是目标值。
第二行是 N 个整数,表示数组中的元素,且每个数的绝对值小于等于 100000。
输出说明:找到的这三个匹配元素所在位置(数组元素起始位置为 1),中间用一个空格隔开,若存在多个,请输出位置最小的一个(例如:数组为 8 5 4 5 3,目标值为 16,位置 1 2 5 和 1 4 5 均满足条件,输出 1 2 5);不满足输出 - 1。
输入样例:
7 12
2 8 7 6 3 4 3
输出样例:
1 3 5
参考源码:
1. import java.util.Scanner;
2. public class FourthProblemPreliminary {
3. public static void main(String[] args) {
4. Scanner input = new Scanner(System.in);
5. int m, n;
6. m = input.nextInt();
7. n = input.nextInt();
8. int[] arr = new int[m];
9. for (int i = 0; i < arr.length; i++) {
10. arr[i] = input.nextInt();
11. }
12. for (int i = 0; i < arr.length-2; i++) {
13. for (int j = i+1; j < arr.length-1; j++) {
14. for (int k = j+1; k < arr.length; k++) {
15. if (arr[i] + arr[j] + arr[k] == n) {
16. System.out.println((i + 1) + " " + (j + 1) + " " + (k + 1));
17. return;
18. }
19. }
20. }
21. }
22. System.out.println("-1");
23. }
24. }
算法思路:
暴力算法,注意三个循环的起始值和结束值。
运行实例:
运行实例1(题目上的测试用例)
运行实例2
运行实例3(不满足条件)
5.给定一个只包含0-9、'+'、'*'的合法数学表达式(长度<1000),规定加号'+'的优先级高于乘号'*',请输出计算结果。
输入说明:合法的数学表达式
输出说明:输出表达式的计算结果
输入样例:
12*3+12*2
输出样例:
360