首先,我觉得参加比赛的前提是要有自学能力、独立思考能力、编码能力,如果没有的话,可能以下内容对你没有多大的用处。
必备知识:
oi赛制与acm赛制的不同,思维,基础数学知识,打表,java语言的熟悉,搜索,模拟,Java容器类,时间复杂度的分析
OI赛制:每道题提交之后都没有任何反馈,每道题都有多个测试点,根据每道题通过的测试点的数量获得相应的分数。每道题不限制提交次数,如果提交错误没有任何惩罚,仅以最后一次提交为准。比赛过程中看不到实时排名,赛后按照总得分来排名。既然是算得分,那么就是得分优先,不是过题数优先
思维很重要,至于如何提高自己的思维能力,这个就得要通过大量的刷题了。可以通过刷codeforces或者atcoder这种时长较短的比赛来锻炼自己的思维能力。当然,还要结合赛后补题来学习解题方法。
怎么说呢,数学知识对算法有多重要就不说了。而java语言的熟悉这个就更不用说了吧。数学的题目大多都是找规律的,可以先输出或者自己带数计算一下前几个数看看有没有规律。
至于模拟和搜索,相信在网上搜关于蓝桥杯的相关信息时,十个里面有九个都是说蓝桥杯是暴力杯,既然是暴力杯,那么暴力枚举和暴搜是不能不会的了。至于怎么暴力,这个你只能多做题了。搜索的深度优先和广度优先入门应该不难。
有些题目可能会用到数据结构的,比如说队列啊set集合啊,如果你真要自己写的话我只能说你是真有空,建议呢还是要掌握一些比较常用的容器类,比如说set集合,有次考了一个计算子集的数量的,就可以用set集合去剔除一些重复的元素,简便又好用。
时间复杂度分析的话,我只了解c++的,Java比c++慢,听说是十倍到三十倍左右,这里就说c++的吧!首先先看数据范围吧,蓝桥杯会给数据划分范围,比如说百分之三十的数据的范围是多少,百分之五十的数据范围是多少,既然是按点给分,那么你就可以按照自己的能力来选择算法去解决问题。计算机1s能计算108左右,那么如果范围是104,那么n2以下的方法就可以随便用了,如果是105,很明显n2就用不了了,只能用nlogn以下的了。所以通过数据范围来推测时间复杂度然后来推出应该用什么算法这个很重要!
中级知识:
时间类(以前有,第十三届后估计用不上了),动态规划,贪心,排序,二分,位进制
动态规划的话,浅学一下吧。遇到了的话,做过同类型的题目,你可能就会做,没做过就肯定不会的了。可以在b站上面搜大雪菜,他有个叫闫氏dp分析法的视频,看闫学灿老师的视频来入门应该差不多了。背包肯定是要会的,其它的看悟性了。
排序建议还是用sort,把那些冒泡和选择排序都收起来,真用不上,用了大概率超时。
二分,都知道二分的时间复杂度是logn,那么二分是一个减少时间复杂度的利器了。当然是用前提得是有序!(二分枚举也可以了解一下)
位进制一般都是最后几题会遇到,浅学一下,万一遇到了呢。
高级知识:
数据结构,图论
在java B组这两种考的都比较简单
数据结构中树是比较常见的,基本也就树的遍历加上思维。当然难一点的还有最小生成树、线段树、树状数组,但基本都是模版题。当然还有并查集等等。
图论范围就广了,但一般考搜索比较多,如果掌握的不是很好也没关系,按照范围来拿分就好了。难一点的可能也就是最短路之类的了,背一下迪杰斯特拉模版就好了。
旁门左道:骗分(现在几乎用不上,用这玩意还不如直接模拟一遍题目来的分多)
低级技巧:
输出样例的答案、输出一个随机数、自己计算前几位数据的答案然后输出。骗到的分可能也就一点点,但聊胜于无
中级技巧:
如果题目是无解就输出-1(比较难遇到)就输出-1,运气好可能能过好几个点。如果是输出“YES”或“NO”,那就自己判断一下哪个会多一点就输出哪个。
高级技巧:
搜索,打表
一些动态规划题,可以DFS;数学题,可以DFS;剪枝的题,更能DFS。通过不断的递归直到出现答案为止。数据小点的一个能出几个点。大点的就超时了。
打表算是搜索的进阶了,可以用一个for循环枚举每一个数据点来搜索答案,然后输出。超时也不管,就放着等他搜出来。然后就是赋给数组,输入什么就输出对应的位置的数据
下面展示一个样例
int a[18]={0,1,2,5,14,42,13,29,1430,4862,16,58,8012,742,2744,969,3670,1790,487};
Scanner s = new Scanner(System.in);
int n=s.nextInt();
System.out.printfln(“%d”,ans[n]);
骗分是旁门左道,也只是旁门左道。怎么说呢,骗分是真的不会了才去使用,不能把骗分当作唯一的手段,掌握好算法才是拿奖最简单的途径!
所以继续加油吧!