我是靠谱客的博主 懵懂纸飞机,最近开发中收集的这篇文章主要介绍2020年 第11届 蓝桥杯 Java B组 省赛真题详解及小结【第2场省赛 2020.10.17】一、试题 A: 门牌制作——答案:641二、试题 B: 寻找 2020——答案:16520三、试题 C: 蛇形填数——答案:761四、试题 D: 七段码——答案:80五、试题 E: 排序——jonmlkihgfedcba六、试题 F: 成绩分析七、试题 G: 单词分析八、试题 H: 数字三角形九、试题 I: 子串分值和十、试题 J: 装饰珠小结,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

  • 蓝桥杯 Java B组 省赛真题详解及小结汇总【2013年(第4届)~2020年(第11届)】

  • 说明:大部分题解思路及程序代码 源自 蓝桥杯 官网视频(Java B组历年真题解析) —— 郑未老师。
  1. 2013年 第04届 蓝桥杯 Java B组 省赛真题详解及小结
  2. 2014年 第05届 蓝桥杯 Java B组 省赛真题详解及小结
  3. 2015年 第06届 蓝桥杯 Java B组 省赛真题详解及小结
  4. 2016年 第07届 蓝桥杯 Java B组 省赛真题详解及小结
  5. 2017年 第08届 蓝桥杯 Java B组 省赛真题详解及小结
  6. 2018年 第09届 蓝桥杯 Java B组 省赛真题详解及小结
  7. 2019年 第10届 蓝桥杯 Java B组 省赛真题详解及小结
  8. 2020年 第11届 蓝桥杯 第1次模拟赛真题详解及小结【Java版】(校内模拟)
  9. 2020年 第11届 蓝桥杯 第2次模拟赛真题详解及小结【Java版】
  10. 2020年 第11届 蓝桥杯 C/C++ B组 省赛真题详解及小结【第1场省赛 2020.07.05】【Java版】
  11. 2020年 第11届 蓝桥杯 Java B组 省赛真题详解及小结【第1场省赛 2020.07.05】
  12. 2020年 第11届 蓝桥杯 Java B组 省赛真题详解及小结【第2场省赛 2020.10.17】
  13. 2020年 第11届 蓝桥杯 Java C组 省赛真题详解及小结【第1场省赛 2020.07.05】

  • 第11届 蓝桥杯-第1、2次模拟(软件类)真题-(2020年3月、4月)-官方讲解视频

目   录

一、试题 A: 门牌制作——答案:641

解法一:x % 10 == 2

解法二:双重for循环+字符数组

二、试题 B: 寻找 2020——答案:16520

三、试题 C: 蛇形填数——答案:761

解法一:规律推公式 (n-1)(2n-1)+n

解法二:手工计算(写满两页A4演草纸)

解法三:第i行第i列的值为a = a + (i*4)

解法四:找规律

四、试题 D: 七段码——答案:80

五、试题 E: 排序——jonmlkihgfedcba

六、试题 F: 成绩分析

七、试题 G: 单词分析

八、试题 H: 数字三角形

九、试题 I: 子串分值和

十、试题 J: 装饰珠

小结


试题下载:【链接:https://pan.baidu.com/s/11bI8HRFmb_FitUMvC5NF6Q   提取码:zjxs】

说明:本文参考了很多大佬的题解。

    

一、试题 A: 门牌制作——答案:641

本题总分:5 分

【问题描述】

小蓝要为一条街的住户制作门牌号。

这条街一共有 2020 位住户,门牌号从 1 到 2020 编号。

小蓝制作门牌的方法是先制作 0 到 9 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、7,即需要 1 个 字符 0,2 个字符 1,1 个字符 7。

请问要制作所有的 1 到 2020 号门牌,总共需要多少个字符 2?

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

【答案】:624

解法一:x % 10 == 2

【解析】:从1~2020开始循环,一直计算即可。

package provincialGames_11_2020_2_JavaB;

public class _01_A_门牌制作 {

	public static void main(String[] args) {
		int ans = 0;
		for (int i = 1; i <= 2020; i++) {
			int x = i;
			while (x > 0) {
				if (x % 10 == 2)
					ans++;
				x /= 10;
			}
		}
		System.out.println(ans);
	}

}

解法二:双重for循环+字符数组

【解析】:从1~2020开始循环,将数字转为字符数字,逐个比较字符。

package provincialGames_11_2020_2_JavaB;

public class _01_A_门牌制作2 {

	public static void main(String[] args) {
		int ans = 0;
		for (int i = 1; i <= 2020; i++) {
			char strArray[] = (i + "").toCharArray();
			for (int j = 0; j < strArray.length; j++) {
				if (strArray[j] == '2') {
					ans++;
				}
			}
		}
		System.out.println(ans);
	}

}

二、试题 B: 寻找 2020——答案:16520

 本题总分:5 分

【问题描述】

小蓝有一个数字矩阵,里面只包含数字 0 和 2。小蓝很喜欢 2020,他想找到这个数字矩阵中有多少个 2020 。

小蓝只关注三种构成 2020 的方式:

• 同一行里面连续四个字符从左到右构成 2020。

• 同一列里面连续四个字符从上到下构成 2020。

• 在一条从左上到右下的斜线上连续四个字符,从左上到右下构成 2020。

例如,对于下面的矩阵:

220000

000000

002202

000000

000022

002020

一共有 5 个 2020。其中 1 个是在同一行里的,1 个是在同一列里的,3 个是斜线上的。

小蓝的矩阵比上面的矩阵要大,由于太大了,他只好将这个矩阵放在了一个文件里面,在试题目录下有一个文件 2020.txt,里面给出了小蓝的矩阵。

请帮助小蓝确定在他的矩阵中有多少个 2020。

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一 个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

【解析】:定义二维矩阵,遍历每个坐标,以每个坐标为起点分别向右向下向右下三个方向遍历。

原文链接

打开 txt 文件,鼠标放到最后一行最后一列,可以知道,是一个300行300列的矩阵。然后直接暴力三次循环,分别是从左到右,从上到下,从左上到右下方向。比赛的时候在这里耗时有点久,因为调试的时候,发现我复制输入这个矩阵后,控制台输出的矩阵只有260多行,一直以为哪里写错了。 

  

package provincialGames_11_2020_2_JavaB;

import java.util.Scanner;

public class _02_B_寻找2020 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int[][] num = new int[301][301];
		for (int i = 1; i <= 300; i++) {
			String str = sc.next();
			for (int j = 1; j <= str.length(); j++) {
				num[i][j] = str.charAt(j - 1) - '0';
			}
		}
		int ans = 0;
		for (int i = 1; i <= 300; i++) {
			for (int j = 1; j <= 300; j++) {
				if (i + 3 <= 300 && num[i][j] == 2 && num[i + 1][j] == 0 && num[i + 2][j] == 2 && num[i + 3][j] == 0)
					ans++;
			}
		}
		for (int i = 1; i <= 300; i++) {
			for (int j = 1; j <= 300; j++) {
				if (j + 3 <= 300 && num[i][j] == 2 && num[i][j + 1] == 0 && num[i][j + 2] == 2 && num[i][j + 3] == 0)
					ans++;
			}
		}
		for (int i = 1; i <= 300; i++) {
			for (int j = 1; j <= 300; j++) {
				if (i + 3 <= 300 && j + 3 <= 300 && num[i][j] == 2 && num[i + 1][j + 1] == 0 && num[i + 2][j + 2] == 2
						&& num[i + 3][j + 3] == 0)
					ans++;
			}
		}
		System.out.println(ans);
	}

}

三、试题 C: 蛇形填数——答案:761

本题总分:10 分

【问题描述】

如下图所示,小明用从 1 开始的正整数“蛇形”填充无限大的矩阵。

                                            1 2 6 7 15 ...

                                            3 5 8 14 ...

                                            4 9 13 ...

                                            10 12 ...                        (1)

                                            11 ...

                                            ...

容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20 列的数是多少?

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

【答案】:761

解法一:规律推公式 (n-1)(2n-1)+n

原文链接

【解析】:由 规律推公式 (n-1)*(2n-1)+n ,带入n=20得结果。

   

  • 第1行:(1 - 1) * (2 * 1 - 1) + 1 = 1
  • 第2行:(1-1)*(2*1 - 1) + 1 = 1
  • 第3行:(1-1)*(2*1 - 1) + 1 = 1
  • ...

解法二:手工计算(写满两页A4演草纸)

【解析】:计算过程——从第1行第1列数据开始计算,一致计算到第20行20列。差不多写满了2页A4纸...

考试的时候,监考员会给每个考生发一张空白A4纸。使用A4纸进行手工计算。演草纸不够的话,A4纸打印的准考证背面也可以使用。

这种题,一看就是找规律的题。大致一看,题中规律显然与斐波那契数列没有关系,慌了...

蓝桥杯就好考斐波那契、全排列,但是这次省赛貌似都没考...

不管黑猫????、白猫????,抓住耗子????就是好猫。o(=•ェ•=)m

解法三:第i行第i列的值为a = a + (i*4)

原文链接

先说下我考试的思路吧,就是把整个矩阵想左转45°,然后就可以发现是一个有规律的三角形,可以发现矩阵中第 i 行第 j 列的数在这个三角形中是第 i* 2-1 行 j* 2-1 列最中间的数,那么第20行第20列就在三角形中的第39行39列的中间,答案也就出来了。

再说下别人的做法,直接找规律,第一行第一列的值为1,第二行第二列的值为5,第三行第三列的值为13,第四行第四列的值为25,仔细观察就可以发现第i行第i列的值为 a = a + (i*4)。可能要多画几个矩阵,才能发现规律。

package provincialGames_11_2020_2_JavaB;

public class _03_C_蛇形填数 {
	public static void main(String[] args) {
		int n = 20;
		System.out.println((n - 1) * (2 * n - 1) + n);
		System.out.println("---------");
		for (int i = 1; i <= 20; i++) {
			System.out.println((i - 1) * (2 * i - 1) + i);
		}
		System.out.println("---------");
		int a = 1;
		for (int i = 0; i < 20; i++) {
			a = a + (i * 4);
			System.out.println(a);
		}
	}
}

解法四:找规律

原文链接

第一行第一列是1;
第二行第二列是前面两条斜行(左上到右下或者右上到左下为一条斜行),再数两个数。
第三行第三列是前面四条斜行,再数三个数。
依次类推,20行第20列是前面38条斜行,再数20个数。
38条斜行为:1+2+…+38,最后结果(1+2+…+38)+20 = (1+38)38/2 +20 = 3919+20 = 761 

四、试题 D: 七段码——答案:80

【问题描述】

小蓝要用七段码数码管来表示一种特殊的文字。

上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二 极管,分别标记为 a, b, c, d, e, f, g。

小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符 的表达时,要求所有发光的二极管是连成一片的。

例如:b 发光,其他二极管不发光可以用来表达一种字符。

例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上一行的方案可以用来表示不同的字符,尽管看上去比较相似。

例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。

例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光 的二极管没有连成一片。

请问,小蓝可以用七段码数码管表达多少种不同的字符?

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只填写这个整数,填写多余的内容将无法得分。

【答案】:80

【解析】:枚举127种字符组合,挨个查看是否联通。DFS生成127个字符组合。

原文链接   思路: 本题的大致思路是

  1. 将数码管的七段进行全排列(用数字代表数码管字段,0代表a,1代表b,以此类推)然后将这7个数字的所有可能全部排列(从7个数字中取m(1<=m<=7)进行排列)列举出来。
  2. 得到所有的取值情况,再判断每种情况构成的图是否连通,若连通,sum++
  3. 进行排列时需要注意,一定要保证每个排列必须是递增或者递减,这样才能不重复,例如:012,021,210等等,它们都表示数码管中取出ABC这一种情况。

package provincialGames_11_2020_2_JavaB;

public class _04_D_七段码 {
	
	static boolean[][] M;// M是邻接矩阵
	static int[] a;// a代表排列组合的数字
	static int sum = 0;// 最后结果

	public static void main(String[] args) {
		/*
		 * M是邻接矩阵,根据数码管图像可以得到 例如:a和b,a和f都可以连通,那么代表0和1,0和5连通
		 */
		M = new boolean[7][7];
		M[0][1] = M[1][0] = M[0][5] = M[5][0] = true;
		M[1][2] = M[2][1] = M[1][6] = M[6][1] = true;
		M[2][3] = M[3][2] = M[2][6] = M[6][2] = true;
		M[4][3] = M[3][4] = true;
		M[4][5] = M[5][4] = M[4][6] = M[6][4] = true;
		M[5][6] = M[6][5] = true;
		a = new int[7];
		for (int i = 0; i < a.length; i++) {
			a[i] = i;
		}
		// 所有排列的可能,深搜
		for (int n = 1; n <= 7; n++) {
			dfs(0, n);
		}
		System.out.println(sum);
	}

	public static void dfs(int k, int n) {
		if (k == n) {
			// 如果只有一个数,那么这种情况下必然成立
			if (n == 1) {
				sum++;
				return;
			}
			// 判断,这种情况下的图是否连通。用的是并查集方法
			// 初始化
			int[] pre = new int[n];
			for (int i = 0; i < pre.length; i++) {
				pre[i] = i;
			}
			for (int i = 0; i < n; i++) {
				for (int j = i + 1; j < n; j++) {
					// 两层for穷举所有边的情况
					// 若i和j连通,j加入i
					// i和j代表的是结点,所以并的时候就是jion(pre,
					// i,j)。但是i代表的结点好j代表的结点是否连通,则需要看a[i]]和[a[j]在邻接矩阵M中是否为真
					if (M[a[i]][a[j]]) {
						jion(pre, i, j);
					}
				}
			}
			// 到最后,若所有结点都连通,则所有结点的跟结点应该都一样。否则说明此情况下的图不连通
			boolean flag = true;
			for (int i = 1; i < pre.length; i++) {
				if (find(pre, 0) != find(pre, i)) {
					flag = false;
					break;
				}
			}
			if (flag) {
				sum++;
			}
			return;
		}
		// dfs,深搜
		for (int i = k; i < a.length; i++) {
			if (k == 0 || a[i] > a[k - 1]) {
				int t = a[i];
				a[i] = a[k];
				a[k] = t;
				dfs(k + 1, n);
				t = a[i];
				a[i] = a[k];
				a[k] = t;
			}
		}
	}

	// 查找根节点
	public static int find(int[] pre, int node) {
		int son = node, temp = 0;
		// 查找根节点
		while (node != pre[node]) {
			node = pre[node];
		}
		// 路径优化
		while (son != node) {
			temp = pre[son];
			// 直接通跟
			pre[son] = node;
			// son向上走一格
			son = pre[son];
		}
		return node;
	}

	// 两个结点相并
	public static void jion(int[] pre, int x, int y) {
		int fx = find(pre, x);
		int fy = find(pre, y);
		// 两个结点属于不同图,相并
		if (fx != fy) {
			pre[fy] = fx;
		}
	}

}

五、试题 E: 排序——jonmlkihgfedcba

本题总分:15 分

【问题描述】

小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。

在冒泡排序中,每次只能交换相邻的两个元素。

小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符,则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。

例如,对于字符串 lan 排序,只需要 1 次交换。对于字符串 qiao 排序,总共需要 4 次交换。

小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要 100 次交换,可是他忘了吧这个字符串记下来,现在找不到了。

请帮助小蓝找一个只包含小写英文字母且没有字母重复出现的字符串,对该串的字符排序,正好需要 100 次交换。如果可能找到多个,请告诉小蓝最短的那个。如果最短的仍然有多个,请告诉小蓝字典序最小的那个。请注意字符串中可以包含相同的字符。

【答案提交】

这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个只包含小写英文字母的字符串,在提交答案时只填写这个字符串,填写多余的内容将无法得分。

【答案】:jonmlkihgfedcba

【解析】:冒泡排序,要求字符串最短,那就假设完全逆序,设长度为n,则移动次数为 n*(n-1)/2,要求移动次数恰好大于100,则 n=15;移动次数105。要求字典序最小,则把第六个字符移动到第一个位置,前五个字符后移一位。纯逻辑推导,无代码。

原文链接

思路: 首先要注意最后得到的字符串全是英文小写字母并且不重复。接下来进行分析,最后要求结果在最短的前提下字典序最小。那么我们先想办法找到最短的结果。
  最短,那是能多短就多短。最短是长度是1,但是肯定不可能,因为他还要求字符串进行了100次交换,那么长度为2可不可以呢?也不行,长度为2的字符串最多进行一次交换。
  一个长度为n的字符串,如果进行冒泡排序,假设他每次比较都进行了交换,那么它最多交换 (n-1)+(n-2)+…+1 = n*(n-1)/2 (进行n-1趟操作,第一趟操作交换n-1次,之后每趟交换的次数依次递减)。
  在n*(n-1)/2>=100的前提下,n的最小值是15。也就是说,最后结果的字符串的长度至少15(低于15,它根本连交换100次的要求都达不到)。接下来再和题目要求的字典序最小一起考虑。
  首先了解一下字典序:字典序是指从前到后比较两个字符串的大小的方法。首先比较第一个字符,如果不同则第一个字符较小的字符串更小,如果相同则继续比较第2个字符…如此继续,来比较整个字符串的大小。
  现在我们知道字符串全是英文小写字母,并且长度为15且各不相同,那么我们可以确定这15个字母就是前15个小写英文字母abcdefghijklklmno,怎么排现在还不知道。
  用逆向思维思考,若这15个字母每次冒泡两两比较都进行交换,能交换 15*(15-1) = 105次,那这个字符串只可能是这15个字母的逆序:onmlkjighfedecba。
  然后我们再想办法减少逆序字符串的5次比较,并且使最后得到的结果字典序最小,只需要把逆序字符串的第六位提前至第一位:jonmlkighfedecba。在这种情况下,字典序就是最小的,我只需要第一位比你小,我就是字典序最小的。而且第1,2,3,4,5趟,每次j会分别和o,n,m,k,l进行比较,但是不交换,这样就省下了5次交换,且最后一共交换105-5=100次。

六、试题 F: 成绩分析

时间限制: 1.0s 内存限制: 512.0MB 本题总分:15 分

【问题描述】

小蓝给学生们组织了一场考试,卷面总分为 100 分,每个学生的得分都是一个 0 到 100 的整数。

请计算这次考试的最高分、最低分和平均分。

【输入格式】

输入的第一行包含一个整数 n,表示考试人数。

接下来 n 行,每行包含一个 0 至 100 的整数,表示一个学生的得分。

【输出格式】

输出三行。

第一行包含一个整数,表示最高分。

第二行包含一个整数,表示最低分。

第三行包含一个实数,四舍五入保留正好两位小数,表示平均分。

【样例输入】

7

80

92

56

74

88

99

10

【样例输出】

99

10

71.29

【评测用例规模与约定】

对于 50% 的评测用例,1 ≤ n ≤ 100。

对于所有评测用例,1 ≤ n ≤ 10000。

【解析】:String.format("%.2f", xxx):自动四舍五入

package provincialGames_11_2020_2_JavaB;

import java.util.Scanner;

public class _06_F_成绩分析 { // String.format("%.2f", xxx):自动四舍五入

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int max = Integer.MIN_VALUE, min = Integer.MAX_VALUE;
		double sum = 0;
		for (int i = 0; i < n; i++) {
			int t = sc.nextInt();
			min = Math.min(min, t);
			max = Math.max(max, t);
			sum += t;
		}
		System.out.println(max + "n" + min + "n" + String.format("%.2f", sum / n));
	}

}

七、试题 G: 单词分析

时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分

【问题描述】

小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。

现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这个字母出现的次数。

【输入格式】

输入一行包含一个单词,单词只由小写英文字母组成。

【输出格式】

输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪个。如果有多个字母出现的次数相等,输出字典序最小的那个。

第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。

【样例输入】

lanqiao

【样例输出】

a

2

【样例输入】

longlonglongistoolong

【样例输出】

o

6

【评测用例规模与约定】

对于所有的评测用例,输入的单词长度不超过 1000。

【解析】:记录每个字符的出现次数即可。

package provincialGames_11_2020_2_JavaB;

import java.util.Scanner;

public class _07_G_单词分析 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		char charArray[] = sc.next().toCharArray(); // 字符数组
		int nums[] = new int[26]; // int型数组 记录 每个字母的出现次数
		for (int i = 0; i < charArray.length; i++) {
			nums[charArray[i] - 'a']++;
		}
		int ans = nums[0], index = 0;
		for (int i = 0; i < 26; i++) {
			if (nums[i] > ans) {
				ans = nums[i];
				index = i;
			}
		}
		System.out.println((char) ('a' + index) + "n" + ans);
	}

}

八、试题 H: 数字三角形

时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分

【问题描述】

上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。

路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。

【输入格式】

输入的第一行包含一个整数 N (1 < N ≤ 100),表示三角形的行数。下面的 N 行给出数字三角形。数字三角形上的数都是 0 至 100 之间的整数。

【输出格式】

输出一个整数,表示答案。

【样例输入】

5

7

3 8

8 1 0

2 7 4 4

4 5 2 6 5

【样例输出】

27

【解析】:dp推导+奇偶判断

package provincialGames_11_2020_2_JavaB;

import java.util.Scanner;

public class _08_H_数字三角形 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int arr[][] = new int[n + 1][n + 1];
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= i; j++) {
				arr[i][j] = sc.nextInt();
				arr[i][j] += Math.max(arr[i - 1][j - 1], arr[i - 1][j]);
			}
		}
		System.out.println(n % 2 == 1 ? arr[n][n / 2 + 1] : Math.max(arr[n][n / 2], arr[n][n / 2 + 1]));
	}
}

九、试题 I: 子串分值和

试题 I: 子串分值和 时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分

【问题描述】

对于一个字符串 S,我们定义 S 的分值 f(S ) 为 S 中出现的不同的字符个数。例如 f(”aba”) = 2,f(”abc”) = 3, f(”aaa”) = 1。

现在给定一个字符串 S [0..n − 1](长度为 n),请你计算对于所有 S 的非空子串 S [i.. j](0 ≤ i ≤ j < n),f(S [i.. j]) 的和是多少。

【输入格式】

输入一行包含一个由小写字母组成的字符串 S。

【输出格式】

输出一个整数表示答案。

【样例输入】

ababc

【样例输出】

28

【样例说明】

子串 f值

a         1

ab       2

aba     2

abab   2

ababc 3

b       1

ba     2

bab   2

babc 3

a       1

ab     2

abc   3

b       1

bc     2

c       1

【评测用例规模与约定】

对于 20% 的评测用例,1 ≤ n ≤ 10;

对于 40% 的评测用例,1 ≤ n ≤ 100;

对于 50% 的评测用例,1 ≤ n ≤ 1000;

对于 60% 的评测用例,1 ≤ n ≤ 10000;

对于所有评测用例,1 ≤ n ≤ 100000。

【解析】:写了个两层暴力,for循环,时间复杂度n^2。HashSet去重。

package provincialGames_11_2020_2_JavaB;

import java.util.HashSet;
import java.util.Scanner;

public class _09_I_字串分值和 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		String string = sc.next();
		char c[] = string.toCharArray();
		long ans = 0;
		for (int i = 0; i < c.length; i++) {
			HashSet<Character> set = new HashSet<Character>(); // HashSet去重
			for (int j = i; j < c.length; j++) {
				set.add(c[j]);
				ans += set.size();
			}
		}
		System.out.println(ans);
	}

}

十、试题 J: 装饰珠

时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分

【问题描述】

在怪物猎人这一款游戏中,玩家可以通过给装备镶嵌不同的装饰珠来获取相应的技能,以提升自己的战斗能力。

已知猎人身上一共有 6 件装备,每件装备可能有若干个装饰孔,每个装饰孔有各自的等级,可以镶嵌一颗小于等于自身等级的装饰珠 (也可以选择不镶嵌)。

装饰珠有 M 种,编号 1 至 M,分别对应 M 种技能,第 i 种装饰珠的等级为 Li,只能镶嵌在等级大于等于 Li 的装饰孔中。

对第 i 种技能来说,当装备相应技能的装饰珠数量达到 Ki 个时,会产生 Wi(Ki) 的价值。镶嵌同类技能的数量越多,产生的价值越大,即 Wi(Ki − 1) < Wi(Ki)。但每个技能都有上限 Pi(1 ≤ Pi ≤ 7),当装备的珠子数量超过 Pi 时,只会产生 Wi(Pi) 的价值。

对于给定的装备和装饰珠数据,求解如何镶嵌装饰珠,使得 6 件装备能得到的总价值达到最大。

【输入格式】

输入的第 1 至 6 行,包含 6 件装备的描述。其中第 i 的第一个整数 Ni 表示第 i 件装备的装饰孔数量。后面紧接着 Ni 个整数,分别表示该装备上每个装饰 孔的等级 L(1 ≤ L ≤ 4)。

第 7 行包含一个正整数 M,表示装饰珠 (技能) 种类数量。

第 8 至 M + 7 行,每行描述一种装饰珠 (技能) 的情况。每行的前两个整数 Lj(1 ≤ Lj ≤ 4) 和 Pj(1 ≤ Pi ≤ 7) 分别表示第 j 种装饰珠的等级和上限。接下来 Pj 个整数,其中第 k 个数表示装备该中装饰珠数量为 k 时的价值 Wj(k)。

【输出格式】

输出一行包含一个整数,表示能够得到的最大价值。

【样例输入】

1 1

2 1 2

1 1

2 2 2

1 1

1 3

3

1 5 1 2 3 5 8

2 4 2 4 8 15

3 2 5 10

【样例输出】

20

【样例说明】

按照如下方式镶嵌珠子得到最大价值 18,括号内表示镶嵌的装饰珠的种类编号:

1: (1)

2: (1)(2)

3: (1)

4: (2) (2)

5: (1)

6: (2)

4 颗技能 1 装饰珠,4 颗技能 2 装饰珠 W1(4) + W2(4) = 5 + 15 = 20。

【评测用例规模与约定】

暂无

小结

河南省赛区:一等奖得奖情况示例(75分)

  • 一、试题 A: 门牌制作——本题总分:5 分
  • 三、试题 C: 蛇形填数——本题总分:10 分
  • 六、试题 F: 成绩分析——本题总分:15 分
  • 七、试题 G: 单词分析——本题总分:20 分
  • 九、试题 I: 子串分值和——本题总分:25 分

最后

以上就是懵懂纸飞机为你收集整理的2020年 第11届 蓝桥杯 Java B组 省赛真题详解及小结【第2场省赛 2020.10.17】一、试题 A: 门牌制作——答案:641二、试题 B: 寻找 2020——答案:16520三、试题 C: 蛇形填数——答案:761四、试题 D: 七段码——答案:80五、试题 E: 排序——jonmlkihgfedcba六、试题 F: 成绩分析七、试题 G: 单词分析八、试题 H: 数字三角形九、试题 I: 子串分值和十、试题 J: 装饰珠小结的全部内容,希望文章能够帮你解决2020年 第11届 蓝桥杯 Java B组 省赛真题详解及小结【第2场省赛 2020.10.17】一、试题 A: 门牌制作——答案:641二、试题 B: 寻找 2020——答案:16520三、试题 C: 蛇形填数——答案:761四、试题 D: 七段码——答案:80五、试题 E: 排序——jonmlkihgfedcba六、试题 F: 成绩分析七、试题 G: 单词分析八、试题 H: 数字三角形九、试题 I: 子串分值和十、试题 J: 装饰珠小结所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(56)

评论列表共有 0 条评论

立即
投稿
返回
顶部