目录
- 2019省赛试题A
- 2019省赛试题B
- 2019省赛试题C
- 2019省赛试题D
一.2019省赛试题A



题目链接:组队 – 蓝桥云课 (lanqiao.cn)
题目要求:
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员,组成球队的首发阵容。
每位球员担任 1 号位至 5 号位时的评分如上表所示。请你计算首发阵容 1 号位至 5 号位的评分之和最大可能是多少?
team.txt文件从网盘链接自取。
链接:https://pan.baidu.com/s/1-LDWwM3XL2GGIpWyGL6VCQ
提取码:564o
解题思路:
本题总共 20 名球员,每个人有 5 个位置可以选,最后要选 5 个人担任首发,这样好像有点复杂。
我们转换一下:我们有 5 个位置,每个位置有 20 种选择方法,5 个位置上的人不能相同,这样一想是不是我们写 5 个 for 循环来暴力枚举所有情况就好了。
最终答案:490。
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan = new Scanner(System.in);
int max = 0;
int[] one = {97, 92, 0, 0, 89, 82, 0, 0, 0, 95, 0, 0, 94, 0, 0, 0, 98, 93, 0, 0};
int[] two = {90, 85, 0, 0, 83, 86, 0, 97, 0, 99, 0, 0, 91, 83, 0, 0, 83, 87, 0, 99};
int[] three = {0, 96, 0, 0, 97, 0, 0, 96, 89, 0, 96, 0, 0, 87, 98, 0, 99, 92, 0, 96};
int[] four = {0, 0, 0, 80, 0, 0, 87, 0, 0, 0, 97, 93, 0, 0, 97, 93, 98, 96, 89, 95};
int[] five = {0, 0, 93, 86, 0, 0, 90, 0, 0, 0, 0, 98, 0, 0, 98, 86, 81, 98, 92, 81};
for(int i = 0; i < 20; i++){
for(int j = 0; j < 20; j++){
for(int k = 0; k < 20; k++){
for(int l = 0;l < 20; l++){
for(int m = 0; m < 20; m++){
if((i != j)&&(i != k)&&(i != l)&&(i != m)
&&(j != k)&&(j != l)&&(j != m)
&&(k != l)&&(k != m)
&&(l != m))
{
if((one[i] + two[j] + three[k] + four[l] + five[m]) > max){
max = one[i] + two[j] + three[k] + four[l] + five[m];
}
}
}
}
}
}
}
System.out.println(max);
scan.close();
}
}
二.2019省赛试题B

题目链接:不同子串 – 蓝桥云课 (lanqiao.cn)
题目要求:
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
一个字符串的非空子串是指字符串中长度至少为 1 的连续的一段字符组成的串。例如,字符串 aaab 有非空子串 a, b, aa, ab, aaa, aab, aaab,一共 7 个。注意在计算时,只算本质不同的串的个数。
请问,字符串 0100110001010001 有多少个不同的非空子串?
解题思路:
由于题目给定的字符串长度很短,所以我们可以直接枚举该字符串的所有子串来统计不同的子串个数。
具体操作为:枚举子串的左端点 l 和右端点 r 来确定子串,然后将该子串丢入 set 去重,最后判断 set 的大小即可。
最终答案:100。
代码:
import java.util.*;
public class Main {
static TreeSet<String> set = new TreeSet<String>();
public static void main(String[] args) {
String s = "0100110001010001";
for (int l = 0 ; l < s.length() ; l++) {
for (int r = l ; r < s.length() ; r++) {
StringBuilder t = new StringBuilder();
for (int k = l ; k <= r ; k++) {
t.append(s.charAt(k));
}
set.add(t.toString());
}
}
System.out.println(set.size());
}
}
三.2019省赛试题C

题目链接:数列求值 – 蓝桥云课 (lanqiao.cn)
题目要求:
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
给定数列 1, 1, 1, 3, 5, 9, 17,⋯,从第 4 项开始,每项都是前 3 项的和。求第 20190324项的最后 4 位数字。
解题思路:
如果单纯的按照 a[i] = a[i – 1] + a[i – 2] + a[i – 3]; 这样递推来写,会发现不超过 100 项,我们的 long long 也存不下这么大的数字了。题目只要求最后四位数字,那么我们可以对10000取模,因为我们只做加法, 高位的数字不会对低位产生影响,所以这样我们就只保留 4 位数字啦,写代码求解跑一会就出来了。
最终答案:4659。
代码:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int a = 1,b = 1,c = 1,d = 0;
for(int i = 4;i <= 20190324;i++){
d = (a + b + c) % 10000;
a = b;
b = c;
c = d;
}
System.out.println(d);
}
}
四.2019省赛试题D

题目链接:数的分解 – 蓝桥云课 (lanqiao.cn)
题目要求:
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
把 2019 分解成 3 个各不相同的正整数之和,并且要求每个正整数都不包含数字 2 和 4,一共有多少种不同的分解方法?
注意交换 3 个整数的顺序被视为同一种方法,例如 1000+1001+18 和 1001+1000+18 被视为同一种。
解题思路:

代码:
public class Main {
static int check(int x)
{
while(x != 0)
{
int now = x % 10;
if(now == 2 || now == 4) return 0;
x = x / 10;
}
return 1;
}
public static void main(String[] args) {
int ans = 0;
for(int i = 1;i <= 2019;i++)
for(int j = i + 1;j <= 2019;j++)
{
int k = 2019 - i - j;
if(check(i) == 1 && check(j) == 1 && check(k) == 1 && i < j && j < k) ans++;
}
System.out.println(ans);
}
}