以下为第十届蓝桥杯省赛Java B组真题加我的题解,如有错误望指正。
题A
【问题描述】
作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员, 组成球队的首发阵容。
每位球员担任 1 号位至 5 号位时的评分如下表所示。
请你计算首发阵容 1 号位至 5 号位的评分之和最大可能是多少? 不贴图了。
解答:最简单的方法就是多重循环。有几个人就循环几次,遍历出所有的结果。
题B
【问题描述】
一个字符串的非空子串是指字符串中长度至少为 1 的连续的一段字符组成 的串。
例如,字符串aaab 有非空子串a, b, aa, ab, aaa, aab, aaab,一共 7 个。
注意在计算时,只算本质不同的串的个数。
请问,字符串0100110001010001 有多少个不同的非空子串?
解答:还是遍历,用set去掉重复的子串。最后返回set.size();
public static void main(String[] args) {
String str = "aaab";
System.out.println(cal(str));
}
private static int cal(String str){
if(str.length() == 0 || str.length() == 1){
return str.length();
}
Set<String> set = new HashSet<>();
for(int i = 1; i <= str.length(); i++){
for(int j = 0; j < str.length(); j++){
if(j + i <= str.length()){
set.add(str.substring(j, j + i));
}
}
}
return set.size();
}
题C
【问题描述】
给定数列 1, 1, 1, 3, 5, 9, 17, …,从第 4 项开始,每项都是前 3 项的和。
求 第 20190324 项的最后 4 位数字。
解答:类似于斐波那契数列,注意的就是超出数值表示范围。
public static void main(String[] args) {
System.out.println(fb(4));
System.out.println(fb(5));
System.out.println(fb(6));
System.out.println(fb(20));
}
private static int fb(int n){
if(n == 1 || n == 2 || n == 3){
return 1;
}
return (fb(n - 1) + fb(n - 2) + fb(n - 3)) % 10000;
}
题D
【问题描述】
把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包 含数字 2 和 4,
一共有多少种不同的分解方法? 注意交换 3 个整数的顺序被视为同一种方法,
例如 1000+1001+18 和 1001+1000+18 被视为同一种。
解答:还是暴力…
public static void main(String[] args) {
int num = 2019;
int count = 0;
for(int i = 1; i < 2019; i++){
for(int j = 1; j < 2019; j++){
for(int k = 1; k < 2019; k++){
int m = i + j + k;
if(m == num && theNumber(i) && theNumber(j) && theNumber(k)){
count++;
}
}