第十届蓝桥杯JavaB组省赛题目解析
题目A:组队
本题可以手动画出得到答案,也可以利用循环得到最大值。输入可以是读取文件(需要做一个字符到整型的变换),也可以运行时复制粘贴。
package com.company;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// place where the input
Scanner scanner = new Scanner(System.in);
int[][] team = new int[20][5];
for(int i = 0; i < 20; i++) {
for (int j = 0; j < 5; j++) {
team[i][j] = scanner.nextInt();
}
}
// define and get maxValue
int maxValue = 0;
for(int i = 0; i < 20; i++){
for(int j = 0; j < 20; j++){
for(int k = 0; k < 20; k++){
for(int p = 0; p < 20; p++){
for(int q = 0; q < 20; q++){
if(i!=j && i!=k && i!=p && i!=q && j!=k && j!=p && j!=q && k!=p && k!=q && p!=q){
int temp = team[i][0] + team[j][1] + team[k][2] + team[p][3] + team[q][4];
if(temp > maxValue) maxValue = temp;
}
}
}
}
}
}
// output maxValue
System.out.println(maxValue);
scanner.close();
}
}
答案:490
题目B:不同子串
首先,确定以Set类型存储子串,可以自动去重;非空子串可以按照字符串长度,得到16组可能的结果(每组长度均为它的组数),循环16次,在每次循环内去可能的开始和结束下标,用substring函数得到子串,放入set中。
package com.company;
import java.util.HashSet;
import java.util.Set;
public class Main {
public static void main(String[] args) {
// save subString
Set<String> subStrings = new HashSet<>();
// define string
String str = "0100110001010001";
int len = str.length();
// 从只有1个字符到有16个字符
for(int k = 1; k <= len; k++){
// 每轮有k个字符 以每个字符开始向后取k-1个字符
for(int beginIndex = 0, endIndex = k; beginIndex < len && endIndex-1 < len; beginIndex ++, endIndex++){
subStrings.add(str.substring(beginIndex, endIndex));
}
}
System.out.println(subStrings.size());
}
}
答案:100
题目C:数列求值
由于最后的结果只要4位数,而且过程中只有加法运算,所以在过程中让20190324项内的数就开始%10000,得到最后4位数。
package com.company;
public class Main {
public static void main(String[] args) {
int num1 = 1, num2 = 1, num3 = 1;
int numTemp = 0;
for(int i = 4; i <= 20190324; i++){
numTemp = (num1 + num2 + num3) % 10000;
num1 = num2;
num2 = num3;
num3 = numTemp;
}
System.out.println(numTemp);
}
}
答案:4659
题目D:数的分解
首先,将2019分解为3个不同的数,不同顺序视为一种,那么我们可以视这三个数为 i < j < k,作为一项判断条件;其次题目上说,每个整数不包含数字2和4,可以用Java自带的字符串处理函数contains作为另一项判断条件。
package com