本篇博客旨在记录自已打卡蓝桥杯3月份刷题集训,同时会有自己的思路及代码解答希望可以给小伙伴一些帮助。本人也是算法小白,水平有限,如果文章中有什么错误之处,希望小伙伴们可以在评论区指出来,共勉?。
文章目录
集训AA1、单词分析A2、门牌制作 集训BB1、一元三次方程求解B2、删除字符 集训CC1、摆动序列C2、格子刷油漆 最后
集训A
A1、单词分析
题目
:小蓝正在学习一门神奇的语言,这门语言中的单词都是由小写英文字母组 成,有些单词很长,远远超过正常英文单词的长度。小蓝学了很长时间也记不住一些单词,他准备不再完全记忆这些单词,而是根据单词中哪个字母出现得最多来分辨单词。
现在,请你帮助小蓝,给了一个单词后,帮助他找到出现最多的字母和这 个字母出现的次数。
输入格式:
输入一行包含一个单词,单词只由小写英文字母组成。
对于所有的评测用例,输入的单词长度不超过 1000。
输出格式:
输出两行,第一行包含一个英文字母,表示单词中出现得最多的字母是哪 个。如果有多个字母出现的次数相等,输出字典序最小的那个。
第二行包含一个整数,表示出现得最多的那个字母在单词中出现的次数。
输入输出样例:
示例 1
输入
lanqiao
输出
a2
示例 2
输入
longlonglongistoolong
输出
o6
运行限制:
最大运行时间:1s最大运行内存: 256M解题代码:
import java.util.Scanner;// 1:无需package// 2: 类名必须Main, 不可修改public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.nextLine(); int[] arr = new int[26]; for (int i = 0; i < str.length(); i++) { arr[str.charAt(i) - 'a']++; } int max = 0; char ch = 'a'; for (int i = arr.length - 1; i >= 0; i--) { if (arr[i] >= max) { max = arr[i]; ch = (char)(i + 'a'); } } System.out.println(ch); System.out.println(max); }}
A2、门牌制作
题目
:
本题为填空题,只需要算出结果后,在代码中使用输出语句将所填结果输出即可。
小蓝要为一条街的住户制作门牌号。
这条街一共有 20202020 位住户,门牌号从 11 到 20202020 编号。
小蓝制作门牌的方法是先制作 00 到 99 这几个数字字符,最后根据需要将字符粘贴到门牌上,例如门牌 1017 需要依次粘贴字符 1、0、1、71、0、1、7,即需要 11 个字符 00,22 个字符 11,11 个字符 77。
请问要制作所有的 11 到 20202020 号门牌,总共需要多少个字符 22?
运行限制:
最大运行时间:1s最大运行内存: 128M解题代码:
import java.util.Scanner;// 1:无需package// 2: 类名必须Main, 不可修改public class Main { public static void main(String[] args) { int count = 0; for(int i = 1; i <= 2020; i++) { int num = i; while(num != 0) { if(num%10==2) { count ++; } num /= 10; } } System.out.println(count); }}
集训B
B1、一元三次方程求解
题目
:有形如:ax3 + bx2 + cx + d = 0 这样的一个一元三次方程。给出该方程中各项的系数(a*,b,c,*d 均为实数),并约定该方程存在三个不同实根(根的范围在 −100 至 100 之间),且根与根之差的绝对值 ≥1。要求由小到大依次在同一行输出这三个实根(根与根之间留有空格),并精确到小数点后 2 位。
提示:记方程 f*(x)=0,若存在 2 个数 x1 和 x2,且x1<x2,f(x1) × f(x2) < 0,则在 (x1,x2)之间一定有一个根。
输入格式:
输入一行,4 个实数 a,b,c,d。
输出格式:
输出一行,3 个实根,从小到大输出,并精确到小数点后 2 位。
输入输出样例:
输入
1 -5 -4 20
输出
-2.00 2.00 5.00
运行限制:
最大运行时间:1s最大运行内存: 128M解题代码:
import java.util.Scanner;/** * @author QIA * @create 2023-03-26-21:48 */public class Main { public static void main(String[] args) { // 暴力枚举 Scanner rd = new Scanner(System.in); double a = rd.nextDouble(); double b = rd.nextDouble(); double c = rd.nextDouble(); double d = rd.nextDouble(); for (double i = -100; i <= 100; i += 0.01) if (Math.abs(a * i * i * i + b * i * i + c * i + d) < 0.000001) System.out.printf("%.2f ", i); }}
B2、删除字符
题目
:给定一个单词,请问在单词中删除 t 个字母后,能得到的字典序最小的单词是什么?
输入格式:
输入的第一行包含一个单词,由大写英文字母组成。
第二行包含一个正整数 t。
其中,单词长度不超过 100,t 小于单词长度。
输出格式:
输出一个单词,表示答案。
输入输出样例:
输入
LANQIAO3
输出
AIAO
运行限制:
最大运行时间:1s最大运行内存: 128M解题代码:
import java.util.Scanner;// 1:无需package// 2: 类名必须Main, 不可修改public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // 接收字符串 String s = sc.nextLine(); // 删除字符长度 int size = sc.nextInt(); // 将接收的字符串转换为整型数组 int[] ch = new int[s.length()]; // 用于存储删除后的元素数组 int[] arr = new int[s.length() - size]; int count = 0; int a = 0, flag = a; for (int i = 0; i < s.length(); i++) { ch[i] = s.charAt(i) - 'A'; } while (size > 0) { flag = a; for (int i = a; i <= flag + size; i++) { if (ch[a] > ch[i]) { a = i; } } size -= (a-flag); arr[count++] = ch[a]; a++; } for (int i = a; i < ch.length; i++) { arr[count++] = ch[i]; } // 遍历并输出,不用换行 for (int j : arr) { System.out.print((char) (j + 'A')); } sc.close(); }}
集训C
C1、摆动序列
题目
:如果一个序列的奇数项都比前一项大,偶数项都比前一项小,则称为一个摆动序列。即 a2i< a2i−1,a2i+1 > a2i。
小明想知道,长度为 m,每个数都是 1 到 n 之间的正整数的摆动序列一共有多少个。
输入格式:
输入一行包含两个整数 m,n (1≤n,m≤1000)。
输出格式:
输出一个整数,表示答案。答案可能很大,请输出答案除以 10000 的余数。
输入输出样例:
输入
3 4
输出
14
运行限制:
最大运行时间:1s最大运行内存: 256M解题代码:
import java.util.Scanner;/** * 动态规划 2020 模拟赛 * 摆动序列 * @author QIA * @create 2023-03-27-9:20 */public class Main { static int[][] dp = new int[1004][1004]; public static int isList(int m, int n) { int sum; for (int i = 1; i <= n; i++) { dp[1][i] = n - i + 1; } for (int i = 2; i <= m; i++) { if (i % 2 != 0) { for (int j = n; j >= 1; j--) { dp[i][j] = (dp[i-1][j-1] + dp[i][j+1]) % 10000; } }else { for (int j = 1; j <= n; j++) { dp[i][j] = (dp[i-1][j+1] + dp[i][j-1]) % 10000; } } } if (m%2 != 0){ sum = dp[m][1]; }else { sum = dp[m][n]; } return sum; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); int m = sc.nextInt(); int n = sc.nextInt(); System.out.println(isList(m, n)); sc.close(); }}
C2、格子刷油漆
题目
:X 国的一段古城墙的顶端可以看成 2×N 个格子组成的矩形(如下图所示),现需要把这些格子刷上保护漆。
你可以从任意一个格子刷起,刷完一格,可以移动到和它相邻的格子(对角相邻也算数),但不能移动到较远的格子(因为油漆未干不能踩!)
比如:a d b c e f 就是合格的刷漆顺序。c e f d a b 是另一种合适的方案。
当已知 N 时,求总的方案数。当 N 较大时,结果会迅速增大,请把结果对 109+7 取模。
输入格式:
输入数据为一个正整数(不大于 1000)。
输出格式:
输出数据为一个正整数。
输入输出样例:
输入
2
输出
24
运行限制:
最大运行时间:1s最大运行内存: 256M解题代码:
import java.util.Scanner;// 1:无需package// 2: 类名必须Main, 不可修改public class Main { static long mod = 1000000007; public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); long[] a = new long[n + 1]; long[] b = new long[n + 1]; long sum; a[1] = 1; a[2] = 6;b[1] = 1; for (int i = 2; i <= n; i++) { b[i] = 2 * b[i-1] % mod; } for (int i = 3; i <= n; i++) { a[i] = (2*a[i-1] + b[i]+4*a[i-2])%mod; } sum = (4 * a[n]) % mod; for (int i = 2; i < n; i++) { sum += ((2*2*a[n-i]*2*b[i-1])%mod + (2*2*a[i-1]*2*b[n-i]%mod)) % mod; // 这里记得都要取余 sum %= mod; } System.out.println(sum); }}
最后
有帮助的话,希望可以点赞❤️+收藏⭐,谢谢各位大佬~~???