2019年第十届蓝桥杯Java省赛B组题解

试题 A: 组队 难度(**)

本题总分:5 分
【问题描述】
作为篮球队教练,你需要从以下名单中选出 1 号位至 5 号位各一名球员, 组成球队的首发阵容。 每位球员担任 1 号位至 5 号位时的评分如下表所示。请你计算首发阵容 1 号位至 5 号位的评分之和最大可能是多少?
在这里插入图片描述

题解:

  1. 找最大值
  2. 每个成员只能出现在某个位置(不能重复)
  3. 暴力求解
package test;

import java.util.Scanner;

public class A {

	public static void main(String[] args) {
		
//		测试样例
//		 97 90 0 0 0 92 85 96 0 0 0 0 0 0 93 0 0 0 80 86 89 83 97 0 0 82 86 0 0 0 0 0
//		 0 87 90 0 97 96 0 0 0 0 89 0 0 95 99 0 0 0 0 0 96 97 0 0 0 0 93 98 94 91 0 0
//		 0 0 83 87 0 0 0 0 98 97 98 0 0 0 93 86 98 83 99 98 81 93 87 92 96 98 0 0 0 89
//		 92 0 99 96 95 81

		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();
			}
		}
		
		//定义最大值TMax
		int TMax = 0;
		int temp = 0; //初始化过程最大值
		
		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 h = 0; h < 20; h++) {
							if((i != j && i != k && i != l && i!= h) && (j != k && j != l && j != h) && (k != l && k != h) && l != h) {
								temp = team[i][0] + team[j][1] + team[k][2] + team[l][3] + team[h][4];
								if(temp > TMax) {
									TMax = temp;
								}
							}
						}
		System.out.println(TMax);
		scanner.close();
	}

}

试题B:不同子串 难度(**)

在这里插入图片描述
思路:看到不同子串,可以采用Java字符串分割,然后用集合的方式来判断是否重复,并且不重复添加进去,最后可以统计集合大小,从而算出正确答案。

package test;

import java.util.HashSet;
import java.util.Set;

public class B {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
		String target = "0100110001010001";
		//主要实现:进行添加校验,出现重复的不添加,最后看集合的大小
		Set<String> sub = new HashSet<>();
		//step相当于确定初始字符串的长度
		for(int step = 0; step < target.length(); step++) {
			for(int beginIndex = 0, endIndex = 1 + step; endIndex <= target.length(); beginIndex++, endIndex++) {
				sub.add(target.substring(beginIndex, endIndex));
			}
		}
		System.out.println(sub.size());
	}

}

结果:100

试题C:数列求和 难度(**)

在这里插入图片描述
思路:这题算是斐波那契数列的衍生版本,从两数之和到三数之和,如果按照一直相加的情况,就算是BigInteger也存不了那么大的数据,然后就是这题的关键,题目只要求我们给出后四位,这样的话,我们就可以在运算的过程中每次只取后四位进行相加,其他舍弃,刚开始可能会有人觉得疑惑不解,下面我们用直观的方式去证明,其他舍弃跟没有舍弃是没有区别的。

eg:假如这个时候我们只要求后两位数字,正常运行的结果是:
1 1 1 3 5 9 17 37 57 111 205 373 689
然后我们用下面的算法:
运行的结果是:
1 1 1 3 5 9 17 37 57 11 05 73 89
上面加粗的部分,刚好对应正常运行时候的四个数字,他们的后两位完全一样,这就证实了我们的假设是正确的

package test;

public class C {

	public static void main(String[] args) {

		int[] a = new int[20190324];
		a[0] = a[1] = a[2] = 1;
		for(int i = 3; i < 20190324; i++) {
			//因为题目要求的是后面四位,所以只跟后面四位有关,在运算的过程中就可以不断的进行取余
			a[i] = (a[i - 3] + a[i - 2] + a[i - 1]) % 10000; 
		}
		System.out.println(a[20190323]);
		
	}

}

正确答案:4659

试题D:数的分解 难度(***)

在这里插入图片描述
思路:(1)分解为三个数(2)三个不相同的正整数。所以划分的思路是这样的:用indexOf确定是否包含的关系,为什么要除3呢,因为A<B、C三个数的排列可能位置是ABC、ACB、CAB可能这三种重复的情况,所以需要除3

package test;

public class D {

	public static void main(String[] args) {

		int n = 2019;
		int num = 0;
		//切记从1开始,因为题目要求分解为正整数
		for(int i = 1; i < n; i++) {
			if((i + "").indexOf("2") != -1 || (i + "").indexOf("4") != -1) {
				continue;
			}
			for(int j = i + 1; j < n; j++) {
				if((j + "").indexOf("2") != -1 || (j + "").indexOf("4") != -1) {
					continue;
				}
				int k = n - i - j;
				if(k == j || k == i) {
					continue;
				}
				if(k > 0 && (k + "").indexOf("2") == -1 && (k + "").indexOf("4") == -1) {
					num++;
				}
			}
		}
		System.out.println(num/3);
		
		
		
	}

}

正确答案:40785

试题F:特别数的和 难度(*)

在这里插入图片描述
题解:我们只需要一次for循环,把每个含有2、0、1、9的数找出来,相加即可

package test;

import java.util.Scanner;

public class F {

	public static Boolean check(int i) {
		if((i + "").indexOf("2") != -1 || (i + "").indexOf("0") != -1 || (i + "").indexOf("1") != -1 || (i + "").indexOf("9") != -1) {
			return true;
		}
		return false;
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		
		Scanner scanner = new Scanner(System.in);
		int n = scanner.nextInt();
		int sum = 0;
		for(int i = 1; i <= n; i++) {
			if(check(i)) {
				sum += i;
			}
		}
		System.out.println(sum);
	}

}

持续更新

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Coder陈、

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值