资源描述
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
点击显示更多内容>>
收藏
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号