2019第十届蓝桥杯JavaB国二 4个月备战经验分享

本人普通本二学生,大二才开始接触的竞赛算法,蓝桥杯选择的JavaB,江苏省赛很顺利,排名第一进国赛。国赛很一般,排名八十拿的国二。分享一下自己四个月的备战经验。

选择

先说说我为什么选的Java,一方面是蓝桥杯问题,DevC++不如Eclipse好用。其实JDK1.6在竞赛算法上的类库跟C++比不占太大优势,而且Java本身执行效率还低,但是Java组Eclipse的优势很明显,不管是代码快速生成还是Debug效率都很高,所以我选择了Java这个工程语言作为自己的竞赛语言。另一方面,避开ACMer很大程度能提高得奖率,虽然说B组没有985同学,但是只要在C语言组,都避不开一部分ACMer。当然如果大家比较自信,也不用走的太束缚,在算法竞赛上C语言组的含金量一定会比Java高。(据说2020十一届蓝桥杯有Python组)

备战

1.Java学习

Java是我非常喜欢的语言,我想直接推荐去网上看培训班的视频,学完JavaSE就行,推荐魔乐科技李兴华老师的视频,非常强的学习大纲,字幕式讲课真的学习效率特别好,也方便衔接以后向JavaEE和架构师的发展。

如果只为竞赛,推荐以下几个点重视就行

· Java语言基础

· Java基础面向对象

· 常用类的使用

String,StringBuffer,Arrays,Math,Date,SimpleDateFormat等等

· IO流

速成就直接学File,Scanner和Writer怎么用就行

· 基本变量类型的封装类

Java泛型技术对基本变量类型非常不友好,建议掌握

· 正则表达式

会拼凑正则表达式,掌握String的matches方法就可以

· 类集框架

List Set Map Queue Stack以及它们的子类继承

· 常用简单类接口实现

Comparable Cloneable等,这几个接口主要服务Set类集

2.算法学习

这边就是比较难啃的骨头了,我觉得算法能力是程序员的内功,掌握多少技术应用是外功,虽然自己在实习的时候工作上用不到很多算法,但是这个我觉得是程序员必备的修养。

Java是偏向工程化的语言,在算法竞赛上的优势不如C++,所有没什么特别好的专对Java的竞赛算法指导书。推荐《竞赛算法入门经典(第二版)》,这本书全部是C++写的样例,但是这本书的思维引导特别好,直接看pdf电子版就行。有数据结构基础的同学可以直接从第七章暴力破解开始学,能学多少学多少,例题用Java实现一遍,勤于笔记和总结。

省赛还是主要面向基础,都是一些基础算法策略的应用和变形,一般来说B组省赛要拿好名次需要掌握

· 暴力破解

枚举排列,子集生成,回溯法,迭代搜索,DFS,BFS等等

· 基本算法

分治,排序,递归,贪心等等

· 博弈论

简单的博弈问题直接采用递归思想,这一部分比较难理解。

· 简单的动态规划

背包问题等

· 简单数理常识

简单数论,递推思想,积分思想,尼姆堆问题等,还有就是质数问题,进制转换,闰年问题,公约数公倍数问题等老生常谈的东西

· 判断程序复杂度

这一点很重要,有时候没思考好,就算写了再多代码,程序效率低下依然无用,建议每次写代码之前想想时间复杂度

3.算法训练

蓝桥杯的模拟系统题库已经很健全了,多刷真题,贵在坚持,一般学校都会为大家开好会员,直接用,一定要勤于coding,也要给自己限时,多思考优化而不是只满足解出。

考场最大限度发挥

1.生理调节

发挥很重要。建议考试前几天调整作息,早睡早起,合理饮食。考试当天早饭一定要多吃点,省赛最好带点能量补充品,比如面包红牛之类,国赛会发面包牛奶和矿泉水,吐槽一下国赛发的面包有点难吃。

2.心理调节

蓝桥杯还是非常面向普通大众学生的比赛,含金量其实一般,主要还是面向普通本一本二学生,如果你真的用心备战了,竞赛入门经典刷通了,把历年真题刷完也理解透彻,我想你的算法水平是大多数同学难以企及的。

3.赛场上要灵动

  • 提前半小时进场,把常用的算法结构提前写好,代码存到非自动还原分区,熟悉键盘和环境,电脑该调还是要调,鼠标灵敏度拉满(我写代码经常要格式化代码,但是又和考试机输入法冲突,所以输入法我全关了)
  • 不要刷新考试页面,国赛我前面那兄弟一直刷新考试网页等题目出来,后来他就登不上了…
  • 下载好题目解压存到非保护硬盘分区里,拿到题目先大致看一下所有题,快速根据每个题分值分配时间。
  • 认真读题!认真读题!认真读题!
  • 如果你发现一个很简单的算法,算法想明白了就是跑不出来答案,建议去上个厕所冷静一下再查错,总比你把错的代码执行几遍再纠结花的时间少。
  • 编程题优先过小样例,自己多编几个不同情况检查算法。然后再写个程序生成大的样例输入,感受程序执行时间和效率。
  • 留时间检查,重新读每道题,检查代码,检查答案是否填错位置。编程题可以把提交的代码复制到Main.java里手动编译手动执行,模拟机器读题,看清输出格式,比如有些输出包含空格,比如输出a_b_c(_代表空格),但是你可能输出的是a_b_c_,但是你又看不出来就很尴尬判错。

P.S. 蓝桥杯是我们学校能够得到的最高的比赛了,我知道还要ACM等更高级的比赛,但是其实很多学校没有好的团队也没有好的资源,很遗憾放弃了。算法很美,但是门槛也很高,我觉得最高效的学习方式是通过一个精通掌握的人传授知识给你避免少走弯路,很遗憾的是很多学校没有这个条件,更别提掌握深度学习人工智能算法的老师了,反倒是那些会读ppt,把那些靠背题得高分的学生捧起来的讲师有不少。另外,算法内功固然重要,但是掌握一些技术的应用在职业发展中其实也很重要。