距离这次蓝桥杯省赛结束已经过了有好几天了,自己也思考了很多,这篇博客就浅浅谈一下自己参加蓝桥杯以及在算法学习途中的一些感受吧,希望能对各位小伙伴有一些帮助。如果有想要真题PDF的朋友,可以看文章的末尾。
并查集 | 【蓝桥杯】考前押题--并查集 |
---|---|
模拟赛 | 【蓝桥杯】模拟赛详解,冲刺国赛 |
每日一题 | 【蓝桥杯】每日一题冲刺国赛 |
CSDN执梗大佬创建的算法社区,欢迎加入:https://bbs.csdn.net/forums/Suanfa?category=0
第一次接触算法,是在我大一学C语言的时候,那个时候从最简单的排序开始学,不知道大家在刚开始学习算法的时候是什么样子的,我来谈谈我自己的感受(一名从大一才开始学习编程的普通大学生),可能是因为我对代码真的不感冒,你无法想象我当时的场景,我甚至无法理解什么是浮点型,对于二进制的转换我也是一脸懵,更别说递归、动态规划.....,当时的我宁愿做一天高数也不愿意多看一会儿C语言和算法,第一个学期就这样浑浑噩噩的过去了,最后的C语言成绩也是不尽人意,我以为我和算法就此别过了,直到上个学期班群里发布的蓝桥杯报名通知,就这样我又鼓起勇气重新学习算法,并报名了这次比赛!
真正意义上的准备我是从寒假开始的,那个时候我的内心很坚定,一定要在这次蓝桥杯中拿奖,于是就开始热血的准备。我当时参考的学习视频的是y总的算法基础课,我依稀记得有一道BFS迷宫题,我看了整整一下午,才算弄出点头绪,我很清楚我自己的算法实力,我心里也没多想什么,只是想着一定要把这道题目给AC掉,后续的学习我吃了不少苦头,每一个视频我都要反复看N遍,我才能理解其中的算法思想,我也曾在夜深人静的时候开始怀疑自己,怀疑自己花这么多时间去学习算法如果最后还拿不了奖,那么做这件事情是否值得,直到我遇到了梗哥,枝姐,小郑,小王,泡泡.......(非常棒的博主,大家赶紧关注一波),是他们让我重新思考学习算法的意义和价值,我依稀记得梗哥说过一句话“我们学习算法的目的,并不仅仅只是因为这次比赛”,我开始带着一种新的心态去学习算法,我开始从一些简单题入手,再慢慢试着做一些有难度的题,BFS,DFS,并查集,动态规划......
比赛前的那几天,我有点失眠,可能是因为第一次参加这种算法类的比赛吧,也有可能是自己准备了这么久害怕最后没有拿到一个满意的成绩吧。比赛结束后,走出考场,心里有些许失落,因为感觉这次比赛没有达到自己的预期,在考前我给自己定了一个至少AC掉6题的小目标,但是我感觉这次有把握能A掉的只有4~5道题目。比赛结束的那天晚上,我一个人躺在床上回想这段时间备赛的点点滴滴,大家在一起刷题的日子真的很快乐,在这段时间里我不仅提升了我那原本拉跨的算法能力,还遇到了一群志同道合的朋友,并且在C站上也获得了1w+的粉丝,这难道不是这场比赛所带给我最珍贵的东西吗?
因为有很多粉丝在后台私信我,想让我出一篇JavaB组的题解,但是因为博主的算法水平有限,在这次比赛中AC掉的题目不多,所以我下面就把前4道自己感觉比较稳的题目来给大家简单讲讲,如有错误,欢迎大家在评论区留言指正!!!!
目录
试题A:星期计算
试题B:山
试题C:字符统计
试题D:最少刷题数
题解分析:
(1)这道题目给的数字是20^22,看似一个很大的数字,其实我们根本不需要跑代码就能算出答案,因为20%7=-1,所以题目就变成了(-1)^22次方为1,因为今天是星期六,所以最终答案是6+1=7.
package 考试; import java.util.Arrays; /** * @author yx * @date 2022-04-09 9:21 */ public class 第二题 { //3138 static long ans=0; public static void main(String[] args) { long a=2022; long b=2022222022; for (long i = a; i <=b ; i++) { if(isHuiwen(i)){ if(isdizen(i)){ ans++; System.out.println(i); } } } System.out.println(ans); } static boolean isHuiwen(long n){ String s=""+n; char[] arr=s.toCharArray(); for (int i = 0; i < s.length()/2; i++) { if(arr[i]!=arr[s.length()-1-i]){ return false; } } return true; } static boolean isdizen(long n){ String s=n+""; char[] arr; char[] brr; if(s.length()%2==0){ String s1=s.substring(0,s.length()/2); arr=s1.toCharArray(); brr=s1.toCharArray(); }else { String s2=s.substring(0,s.length()/2+1); arr=s2.toCharArray(); brr=s2.toCharArray(); } Arrays.sort(arr); String st1=new String(arr); String st2=new String(brr); if(st2.equals(st1)){ return true; }return false; } }
题解分析:
(1)这道题目属于“回文类”题目,仔细看题会发现不仅要满足回文条件还得要“左:单调不减;右:单调不增”,这个其实也很简单写一个再写一个判断函数即可
(2)博主这道题目用的是笨方法,直接暴力破解,写一个isHuiwen()函数判断回文,一个isdizen()函数判断左边是否递增,因为左右对称,左边递增即右边递减,所以只用判断左边即可,然后循环暴力,大概需要两三分钟的时间,最后跑出来的答案是3138;
(3)暴力小妙招,大家可能会害怕这种大数据的暴力处理很容易出错,我建议可以直接把所有结果都打印一遍,这样子一是可以最后可以自己检查一下,二是可以知道程序是在跑的,而不是进入某种死循环!!!
package 考试; import java.util.ArrayList; import java.util.Scanner; /** * @author yx * @date 2022-04-09 9:35 */ public class 第三题 { public static void main(String[] args) { ArrayList
list=new ArrayList<>(); Scanner scanner = new Scanner(System.in); String s=scanner.next(); char[] arr=s.toCharArray(); int [] count=new int[s.length()]; for (int i = 0; i < s.length(); i++) { int j=arr[i]-'A'; count[j]++; } int max=0; for (int i = 0; i < s.length(); i++) { if(count[i]>=max){ max=count[i]; } } for (int i = 0; i < s.length(); i++) { if(count[i]==max){ System.out.print((char)('A'+i)); } } } } 题解分析:
(1)这个题目也不难,博主比赛的时候用的也是最简单也是最容易想到的方法
(2)首先定义一个数组,用来计数,对每一个字符出现的次数进行求和,然后存在数组中,找出出现次数最大的那个字符的次数,然后从头再开始遍历一遍(满足题目要求的按字母表顺序),输出出现次数最多的字母。
package 考试; import java.util.Arrays; import java.util.Scanner; /** * @author yx * @date 2022-04-09 9:48 */ public class 第四题 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); int n=scanner.nextInt(); int[] arr=new int[n]; int[] brr=new int[n]; for (int i = 0; i < n; i++) { arr[i]=scanner.nextInt(); brr[i]=arr[i]; } Arrays.sort(arr); int mi=arr[arr.length/2]; for (int i = 0; i < n; i++) { if (arr.length % 2 != 0) {//偶数特判 if (brr[i] >= mi) { System.out.print(0 + " "); } else { System.out.print((mi - brr[i] + 1) + " "); } } else {//奇数特判 if (brr[i] >= mi) { System.out.print(0 + " "); } else { System.out.print((mi - brr[i]) + " "); } } } } }
题解分析:
(1)这道题目的难点在于奇数和偶数的输入个数特判,然后寻找中位数
(2)当它为偶数的时候是不需要+1的(这个地方挖了一个大坑)
举个例子:
输入:
49 10 11 12
输出:
2 1 0 0
这个时候直接用11去减就ok了
经过此次蓝桥杯,我也充分意识到自己存在的问题,算法的学习绝对不是一朝一夕,而是日积月累的坚持,欢迎大家加入:高校算法学习社区
关于真题的PDF有需要的朋友后台私信我或者评论区留言!!!
看完后如果有帮助的话,希望能够动动小手点个赞,非常感谢!!!