2020年第十一届蓝桥杯10月省赛真题(JavaB组题解)
- 试题 A:门牌制作
- 试题 B:寻找 2020
- 试题 C:蛇形填数
- 试题 D: 七段码
- 试题 E:排序
- 试题 F: 成绩分析
- 试题 G: 单词分析
- 试题 H: 数字三角形
- 试题 I: 子串分值和
- 试题 J: 装饰珠
试题 A:门牌制作
本题总分:5 分
【问题描述】 小兰想为一条街的居民制作门牌号。 这条街一共有 2020 住户,门牌号从 1 到 2020 编号。 小蓝制作门牌的方法是先制作门牌 0 到 9 这些数字符最终根据需要将字符 贴在门牌上的符号,比如门牌 1017 要依次粘贴字符 1、0、1、7,即需要 1 个字符 0,2 个字符 1,1 个字符 7。 制作一切 1 到 2020 号门牌需要多少个字符? 2?
思路
每个数据中累加2个数字
//第十一届蓝桥杯 试题 A:门牌制作 public class Main {
public static void main(String[] args) {
int num=0; for(int i=0;i<2021;i ){
// 转换为字符串类型 String str=i ""; for(int j=0;j<str.length();j ){
// 用ASCII判断字符串中是否含有2 if(str.charAt(j)=='2'){
num ; } } } System.out.println(num); } }
答案:624
试题 B:寻找 2020
本题总分:5 分
【问题描述】 小蓝有一个只包含数字矩阵的数字矩阵 0 和 2.小蓝很喜欢 2020年,他想找出这个数字矩阵中有多少个 2020 。 小蓝只注重三种构成 2020 的方式: ?同一行连续四个字符从左到右构成 2020。 ?连续四个字符从上到下构成同一列 2020。 ?连续四个字符在从左上到右下的斜线上,从左上到右下构成 2020。例如,以下矩阵: 220000 000000 002202 000000 000022 002020
一共有 5 个 2020。其中 1 一个在同一行,1 一个在同一列,3 在斜线上。 小蓝的矩阵比上面的矩阵要大,由于太大了,他只好将这个矩阵放在了一 在试题目录中有一个文件 2020.txt,里面是小蓝矩阵。 请帮助小兰确定他的矩阵中有多少个 2020。
2020.txt文档下载
//第十一届蓝桥杯 试题 B:寻找 2020 public class Main {
public static long count;
public static void main(String[] args) {
//输入文档中的数据
Scanner read = new Scanner(System.in);
String[] str = new String[300]; //共三百行数据
for(int i=0;i<300;i++){
str[i] = read.nextLine();
}
read.close();
f(str);
System.out.println(count);
read.close();
}
public static void f(String[] str){
for(int i=0;i<str.length;i++){
for(int j=0;j<str[i].length();j++){
if(str[i].charAt(j)=='2'){
//开头一定是2
//横向
if(str[i].length()-j>=4 && str[i].charAt(j+1)=='0' && str[i].charAt(j+2)=='2' && str[i].charAt(j+3)=='0')
count++;
//竖向
if(str.length-i>=4 && str[i+1].charAt(j)=='0' && str[i+2].charAt(j)=='2' && str[i+3].charAt(j)=='0')
count++;
//斜向
if(str[i].length()-j>=4 && str.length-i>=4 && str[i+1].charAt(j+1)=='0' && str[i+2].charAt(j+2)=='2' && str[i+3].charAt(j+3)=='0')
count++;
}
}
}
}
}
答案:16520
试题 C:蛇形填数
本题总分:10 分
【问题描述】 如下图所示,小明用从 1 开始的正整数“蛇形”填充无限大的矩阵。
容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20 列的数是多少?
思路:观察题目,易发现如下规律
//第十一届蓝桥杯 试题 C:蛇形填数
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
System.out.println(result(n));
}
private static int result(int n) {
if (n == 1) {
return 1;
}
return result(n - 1) + 4 * (n - 1);
}
}
答案:761
试题 D: 七段码
本题总分:10 分
【问题描述】 小蓝要用七段码数码管来表示一种特殊的文字。
上图给出了七段码数码管的一个图示,数码管中一共有 7 段可以发光的二极管,分别标记为 a, b, c, d, e, f, g。 小蓝要选择一部分二极管(至少要有一个)发光来表达字符。在设计字符 的表达时,要求所有发光的二极管是连成一片的。 例如:b 发光,其他二极管不发光可以用来表达一种字符。 例如:c 发光,其他二极管不发光可以用来表达一种字符。这种方案与上一行的方案可以用来表示不同的字符,尽管看上去比较相似。 例如:a, b, c, d, e 发光,f, g 不发光可以用来表达一种字符。 例如:b, f 发光,其他二极管不发光则不能用来表达一种字符,因为发光的二极管没有连成一片。 请问,小蓝可以用七段码数码管表达多少种不同的字符?
思路:相当于在{a, b, c, d, e, f, g}的所有子集里面,找到子集元素是相通的就行,先枚举所有子集,然后通过dfs看该子集元素是否相通。
//第十一届蓝桥杯 试题 D:七段码
public class Main{
static int ans = 0;
static int[] jl = new int[10];
static int[][] map = new int[10][10];
static int[] father = new int[10];
public static void main(String[] args){
//储存关系 a~g对应1~7
map[1][2] = map[2][1] = 1;//a b
map[1][6] = map[6][1] = 1;//a f
map[2][7] = map[7][2] = 1;//b g
map[2][3] = map[3][2] = 1;//b c
map[3][4] = map[4][3] = 1;//c d
map[3][7] = map[7][3] = 1;//c g
map[4][5] = map[5][4] = 1;//d e
map[5][6] = map[6][5] = 1;//e f
map[5][7] = map[7][5] = 1;//e g
map[6][7] = map[7][6] = 1;//f g
//dfs遍历所有情况
dfs(0);
//
System.out.print(ans);
}
public static void dfs(int n){
//当7个灯都有状态时 进行判定
if(n==7){
//把亮着的灯统计下来
ArrayList<Integer> a = new ArrayList<>();
for(int i=1;i<=7;i++){
if(jl[i]==1){
a.add(new Integer(i));
}
}
//判断
if(a.size()!=0){
if(judge(a)==1){
ans++;
}
}
a.clear();
return;
}
//否则dfs灯情况
jl[n+1] = 1;
dfs(n+1);
jl[n+1] = 0;
dfs(n+1);
}
public static int judge(ArrayList<Integer> a){
//System.out.println(++js);
//并查集父集重置
for(int i=0;i<10;i++){
father[i] = i;
}
//并集
for(int i=0;i<a.size();i++){
for(int ii=0;ii<a.size();ii++){
//如果两边相连的话 进行并集操作
if(map[a.get(i).intValue()][a.get(ii).intValue()]==1)
{
int fx = find(a.get(i).intValue());
int fy = find(a.get(ii).intValue());
if(fx!=fy){
father[fx] = fy;
}
}
}
}
//查看是否都属于一个集合
int temp = find(a.get(0).intValue());
for(int i=1;i<a.size();i++){
if(find(a.get(i).intValue())!=temp){
return 0;
}
}
return 1;
}
//查集
public static int find(int x){
return father[x]==x ? x : (father[x] = find(father[x]));
}
}
答案:80
试题 E:排序
本题总分:15 分
【问题描述】 小蓝最近学习了一些排序算法,其中冒泡排序让他印象深刻。 在冒泡排序中,每次只能交换相邻的两个元素。 小蓝发现,如果对一个字符串中的字符排序,只允许交换相邻的两个字符, 则在所有可能的排序方案中,冒泡排序的总交换次数是最少的。 例如,对于字符串 lan 排序,只需要 1 次交换。对于字符串 qiao 排序, 总共需要 4 次交换。 小蓝找到了很多字符串试图排序,他恰巧碰到一个字符串,需要 100 次交换,可是他忘了吧这个字符串记下来,现在找不到了。 。如果可能找到多个,请告诉小蓝最短的那个。如果最短的仍然有多个,请告诉小蓝字典序最小的那个。请注意字符 串中可以包含相同的字符。
思路:冒泡排序,要求字符串最短,那就假设完全逆序,设长度为n,则移动次数为 n*(n-1)/2,要求移动次数恰好大于100,则 n=15;移动次数105。要求字典序最小,则把第六个字符移动到第一个位置,前五个字符后移一位。
//第十一届蓝桥杯 试题 E:排序
public class Main {
public static void main(String[] args) {
char[] s = "jonmlkihgfedcba".toCharArray();
int count = 0;
for (int j = 0; j < s.length - 1; j++) {
for (int i = 0; i < s.length - j - 1; i++) {
if (s[i] > s[i + 1]) {
char temp = s[i];
s[i] = s[i + 1];
s[i + 1] = temp;
count++;
}
}
}
for (char c : s) {
System.out.print(c);
}
System.out.println();
System.out.println(count);
}
}
答案:jonmlkihgfedcba
试题 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。
// 第十一届蓝桥杯 试题 F: 成绩分析
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scanner = new Scanner(System.in);
int n = 0,t=0,max=Integer.MIN_VALUE,min=Integer.MAX_VALUE;
double sum = 0;
n = scanner.nextInt();
for (int i = 0; i < n; i++) {
t = scanner.nextInt();
sum+= t;
if (t>max) {
max = t;
}
if (t<min) {
min = t;
}
}
System.out.println(max);
System.out.println(min);
System.out.println(String.format("%.2f", sum/n));
}
}
试题 G: 单词分析
时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分
【问题描述】 小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不 住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得 最多来分辨单词。 现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这 个字母出现的次数。
【输入格式】 输入一行包含一个单词,单词只由小写英文字母组成。
【输出格式】 输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪 个。如果有多个字母出现的次数相等,输出字典序最小的那个。 第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。
【样例输入】 lanqiao
【样例输出】 a 2
【样例输入】 longlonglongistoolong
【样例输出】 o 6
【评测用例规模与约定】 对于所有的评测用例,输入的单词长度不超过 1000。
// 第十一届蓝桥杯 试题 G:单词分析
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
char[] ch = scanner.nextLine().toCharArray();
int[] num = new int[26];
for (int i = 0; i < ch.length; i++) {
num[ch[i]-'a']++;
}
int max = Integer.MIN_VALUE;
char maxChar = 0 ;
for (int i = 0; i < num.length; i++) {
if (num[i] > max) {
max = num[i];
maxChar = (char) ('a' <