2020年第十一届蓝桥杯JavaC组(十月场)真题解析

您所在的位置:网站首页 飞往日本机票价格 2020年第十一届蓝桥杯JavaC组(十月场)真题解析

2020年第十一届蓝桥杯JavaC组(十月场)真题解析

2023-12-08 19:38| 来源: 网络整理| 查看: 265

相关题目:

2016年第七届蓝桥杯真题解析JavaB组

2016年第七届蓝桥杯真题解析JavaC组

2017年第八届蓝桥杯真题解析JavaB组

2017年第八届蓝桥杯真题解析JavaC组

2018年第九届蓝桥杯真题解析JavaB组

2018年第九届蓝桥杯真题解析JavaC组

2019年第十届蓝桥杯真题解析JavaB组

2019年第十届蓝桥杯真题解析JavaC组

2020年第十一届蓝桥杯JavaB组(七月场)真题解析

2020年第十一届蓝桥杯JavaC组(七月场)真题解析

2020年第十一届蓝桥杯JavaB组(十月场)真题解析

2020年第十一届蓝桥杯JavaC组(十月场)真题解析

文章目录 A 约数个数B 寻找2020试题 C: 跑步锻炼D 平面分割D 七段码F: 成绩统计G 单词分析H 数字三角形I: 作物杂交J 子串分值和

A 约数个数

【问题描述】

对于一个整数,能整除这个整数的数称为这个数的约数。 例如:1, 2, 3, 6 都是 6 的约数。 请问 78120 有多少个约数。

【答案提交】

思路:直接遍历判断

代码:

public class 约数个数 { public static void main(String[] args) { int ans = 0; for (int i = 1; i static int count=0; static char [][]arr2=new char[400][400]; static char []arr3={'2','0','2','0'}; public static void main(String[] args) { Scanner input=new Scanner(System.in); String []arr=new String[301]; for(int i=0;i arr2[i]=arr[i].toCharArray(); } for(int i=0;i if(arr2[i][j]=='2'){ dfs(i,j); } } } System.out.println(count); } public static void dfs(int x,int y){ int flag=1;//用来判断是否满足条件 //找从左往右 for(int i=1;i flag=0; break; } if(arr2[x][y+i]!=arr3[i]){ flag=0; break; } } if(flag==1) count++; //每判断一次要更新flag=1,以免对下一次判断造成误解 flag=1; //从上到下 for(int i=1;i flag=0; break; } if(arr2[x+i][y]!=arr3[i]) { flag=0; break; } } if(flag==1 ) count++; flag=1; //左上到右下 for(int i=1;i flag=0; break; } if(arr2[i+x][y+i]!=arr3[i]){ flag=0; break; } } if(flag==1) count++; } }

答案:

16520 试题 C: 跑步锻炼

本题总分:10 分

【问题描述】

小蓝每天都锻炼身体。 正常情况下,小蓝每天跑 1 千米。如果某天是周一或者月初(1 日),为了激励自己,小蓝要跑 2 千米。如果同时是周一或月初,小蓝也是跑 2 千米。 小蓝跑步已经坚持了很长时间,从 2000 年 1 月 1 日周六(含)到 2020 年10 月 1 日周四(含)。请问这段时间小蓝总共跑步多少千米?

思路:

先要把判断是不是闰年,然后2020年的时候要特判一下,因为 2020年只到10月1日,判断星期几的时候只要取余就好了一月一号 是星期六 那么对应的就是 2号对应星期天,3号对应星期一,4号 对应星期二......天数下标从0开始 public class 跑步锻炼 { static int []week={6,7,1,2,3,4,5};//一月一号星期六,依次往后推 static int []months={0,31,28,31,30,31,30,31,31,30,31,30,31}; public static void main(String[] args) { int ans=0; int sumday=0;//总天数.用来判断星期几 //年 for(int year=2000;year //不是闰年就按正常的来 for(int month=1;month if(day==1||week[sumday%7]==1) ans+=2; else ans++; sumday++; } } } //是闰年 else { if(year==2020){//特判一下2020年因为今年就10个月跑 for (int month = 1; month ans+=2; break; } if (month != 2&&month if (day == 1 || week[sumday % 7] == 1) ans += 2; else ans++; sumday++; } } else if(month==2){ for (int day = 1; day for (int month = 1; month for (int day = 1; day for (int day = 1; day if((year%4==0&&year%100!=0)||year%400==0){ return true; } else return false; } }

答案:8879

D 平面分割

本题总分:10 分

【问题描述】

20 个圆和 20 条直线最多能把平面分成多少个部分?

抱歉能力有限写不来 D 七段码

题目:

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

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

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

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

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

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

思路:

大体思路是这样 1.要求多少种不同的表达式,换一种说法a~g所有的灯排成一行,放进一个 一维数组(递归实现指数型枚举),每次从中选取人n个灯,选到的灯变亮, 不选的不亮,这样就把所有情况都包含进来,我们只需判断每一种情况是否 合法,和发则ans++; 2.为了更好的判断所有亮的灯是否联通,把原图转换成一下这种二维图 然后六个方向搜索就行了,哪六个呢:右下、左下、左上、右上、下两格、上两格; 3.注意并不是所有的灯都有以上这六种方向,看原图的灯,如果a和g这 两个灯亮了并不满足题意,因为它们不相连,因此a、g、d这个一列所搜的 时候不会有六个方向只会有四个;

在这里插入图片描述 代码:

import java.util.Scanner; public class 七段码 { static int N=7; static int ans=0; static int countdeng=0;//每一次深搜时亮灯的个数 public static void main(String[] args) { Scanner input=new Scanner(System.in); //把所有灯的情况全部判断出来,然后判断此时的情况是否合法 //第一步深搜枚举 int []arr=new int[8]; int []vis=new int[8]; dfs(arr,vis,1); System.out.println(ans); } static void dfs(int []arr,int []vis,int level){ if(level>7){ check(arr); return; } //一共就两种情况,一种是要当前这个灯亮,一种是不要,分别深搜就行 vis[level]=1; arr[level]=1; dfs(vis,arr,level+1); vis[level]=0; arr[level]=0; dfs(vis,arr,level+1); } static void check(int []arr){ //先把此时灯亮的情况,在表格中显示出来,如果某一个灯需要亮 //在二维表格中它对应的数就为1; int [][]map=new int[6][4]; int [][]tempmap=new int[6][4]; //a map[1][2]=arr[1]; //b map[2][3]=arr[2]; //c map[4][3]=arr[3]; //d map[5][2]=arr[4]; //e map[4][1]=arr[5]; //f map[2][1]=arr[6]; //g map[3][2]=arr[7]; //我们要看此时灯是否能连起来 //可以还用深搜,先把所有的灯亮的个数记录起来 //然后以其中一个亮点为起点,向其中六个方向深搜 //每找到一个一个可以联通的点总的灯数就减去一 //最后全部搜完后还剩一盏灯亮着就说明当前方案可行,反之则不行 //找总共有多少盏灯亮着 //所欲多次深搜要初始化 countdeng=0; for(int i=1;i if (map[i][j] != 0) countdeng++; } } //找到了所有灯之后,找一个亮灯的点,开始深搜 int flag=0;//只需要找一个点深搜即可,搜一次后就全部停止 for(int i=1;i if (map[i][j] != 0) { flag = 1; check2(map,tempmap, i, j); break; } } if (flag==1) break; } if(countdeng-1==0) { ans++; } } //能走的六个方向 public static int []xx={1,1,-1,-1,-2,2};//2和-2是因为原图中两个边上的相连也算 //转换成二维图就是加-2和加2 public static int []yy={-1,1,-1,1,0,0}; static void check2(int [][]map,int [][]temp,int x,int y){ temp[x][y]=1;//起始点也要标记下 for(int i=0;i continue; } //这一步很重要,因为中间的a,g,d按原图来是不能上下跳的,这样按原图来是不连续的 //然后就是判断是否越界,是否已经找过,是否灯亮 int tempx=x+xx[i]; int tempy=y+yy[i]; //看是否越界 if(tempx>5||tempx3||tempy public static void main(String[] args) { Scanner input=new Scanner(System.in); int N=input.nextInt(); double []arr=new double[N+1]; double hege=0; double better=0; for(int i=0;i public static void main(String[] args) { Scanner input=new Scanner(System.in); String a=input.next(); char []arr=a.toCharArray(); int max=-1; int maxchar=' '; int []count=new int[129]; for(int i=0;i if(count[i]>max){ max=count[i]; maxchar=i; } } System.out.println((char)(maxchar)); System.out.println(max); } } H 数字三角形

【问题分析】: 在这里插入图片描述

上图给出了一个数字三角形。从三角形的顶部到底部有很多条不同的路径。 对于每条路径,把路径上面的数加起来可以得到一个和,你的任务就是找到最大的和。 路径上的每一步只能从一个数走到下一层和它最近的左边的那个数或者右边的那个数。此外,向左下走的次数与向右下走的次数相差不能超过 1。

输入格式

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

输出格式

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

思路:

这题要想的一点就是`“左下走的次数与向右下走的次数相差不能超过 1” 看着两个草图就比较好理解了,只要理解的剩下的就是dp

在这里插入图片描述在这里插入图片描述代码:

import java.util.Scanner; public class 数字三角形 { public static void main(String[] args) { Scanner input=new Scanner(System.in); int n=input.nextInt(); int [][]arr=new int[n+1][n+1]; int [][]dp=new int[n+1][n+1]; for(int i=1;i arr[i][j]=input.nextInt(); } } for(int i=1;i //最里面一列只能从上面下来 if(j==1){ dp[i][j]=dp[i-1][j]+arr[i][j]; } //每行最边上一列只能从左上角下来 else if(i==j){ dp[i][j]=dp[i-1][j-1]+arr[i][j]; } else { dp[i][j]=Math.max(dp[i-1][j],dp[i-1][j-1])+arr[i][j]; } } } if(n%2!=0){ System.out.println(dp[n][n/2+1]); } else { System.out.println(Math.max(dp[n][n/2+1],dp[n][n/2])); } } } I: 作物杂交

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

【问题描述】

作物杂交是作物栽培中重要的一步。已知有 N 种作物 (编号 1 至 N ),第i 种作物从播种到成熟的时间为 Ti。作物之间两两可以进行杂交,杂交时间取两种中时间较长的一方。

如作物 A 种植时间为 5 天,作物 B 种植时间为 7 天,则 AB 杂交花费的时间为 7 天。作物杂交会产生固定的作物,新产生的作物仍然属于 N 种作物中的一种。

初始时,拥有其中 M 种作物的种子 (数量无限,可以支持多次杂交)。同时可以进行多个杂交过程。求问对于给定的目标种子,最少需要多少天能够得到。

如存在 4 种作物 ABCD,各自的成熟时间为 5 天、7 天、3 天、8 天。初始拥有 AB 两种作物的种子,目标种子为 D,

已知杂交情况为 A × B → C,A × C → D。则最短的杂交过程为: 第 1 天到第 7 天 (作物 B 的时间),A × B → C。 第 8 天到第 12 天 (作物 A 的时间),A × C → D。

花费 12 天得到作物 D 的种子。 【输入格式】

输入的第 1 行包含 4 个整数 N, M, K, T,N 表示作物种类总数 (编号 1 至N),M 表示初始拥有的作物种子类型数量,K 表示可以杂交的方案数,T 表示目标种子的编号。 第 2 行包含 N 个整数,其中第 i 个整数表示第 i 种作物的种植时间Ti(1 ≤ Ti ≤ 100)。 第 3 行包含 M 个整数,分别表示已拥有的种子类型 Kj(1 ≤ Kj ≤ M),Kj两两不同。 第 4 至 K + 3 行,每行包含 3 个整数 A, B,C,表示第 A 类作物和第 B 类作物杂交可以获得第 C 类作物的种子。 【输出格式】

输出一个整数,表示得到目标种子的最短杂交时间。

【样例输入】

6 2 4 6 5 3 4 6 4 9 1 2 1 2 3 1 3 4 2 3 5 4 5 6

【样例输出】

16

【样例说明】

第 1 天至第 5 天,将编号 1 与编号 2 的作物杂交,得到编号 3 的作物种子。 第 6 天至第 10 天,将编号 1 与编号 3 的作物杂交,得到编号 4 的作物种子。 第 6 天至第 9 天,将编号 2 与编号 3 的作物杂交,得到编号 5 的作物种子。 第 11 天至第 16 天,将编号 4 与编号 5 的作物杂交,得到编号 6 的作物种子。

总共花费 16 天。

【评测用例规模与约定】

对于所有评测用例,1 ≤ N ≤ 2000, 2 ≤ M ≤ N, 1 ≤ K ≤ 100000, 1 ≤ T ≤ N,保证目标种子一定可以通过杂交得到。

抱歉能力有限,没写来

J 子串分值和

问题描述:

对于一个字符串 S,我们定义 S 的分值 f(S ) 为 S 中恰好出现一次的字符个数。例如 f(”aba”) = 1,f(”abc”) = 3, f(”aaa”) = 0。 现在给定一个字符串 S [0…n - 1](长度为 n),请你计算对于所有 S 的非空子串 S [i… j] (0 ≤ i ≤ j < n),f(S [i… j]) 的和是多少。

输入格式

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

输出格式

输出一个整数表示答案。

数据范围

对于 20%的评测用例,1≤n≤10; 对于 40% 的评测用例,1≤n≤100; 对于 50% 的评测用例,1≤n≤1000; 对于 60% 的评测用例,1≤n≤10000; 对于所有评测用例,1≤n≤100000。

输入样例:

ababc

输出样例:

21

样例说明

所有子串 f

值如下:

a 1 ab 2 aba 1 abab 0 ababc 1 b 1 ba 2 bab 1 babc 2 a 1 ab 2 abc 3 b 1 bc 2 c 1

AcWing大佬题解



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3