蓝桥杯总结

       蓝桥杯这个比赛,一开始是大二的时候老师群里宣传才听说的,看起来好像跟以前的noip有似曾相识的感觉,于是果断报了名。由于是第一年,对蓝桥杯这个比赛的水平并不是太了解,而且用java语言写算法也不熟,于是就参加了java b组。之后又磨磨蹭蹭了一段,从寒假才开始准备蓝桥杯,虽然以前中学oi弄了很久但又是几年没弄算法方面的,还是忘记了许多。 于是买了本《挑战程序设计竞赛》,结合以前就有的《算法竞赛入门经典训练指南》,开始重拾些算法。假期的时候是在蓝桥杯的练习系统上刷蓝桥杯的历届试题,刷的差不多,就去poj上面,按照书后面分类提供的练习题做的。偶尔,遇到新的算法,也会收藏些学习的网页,自己用java动手写个模板(毕竟书本上基本都是c++语言实现的)。省赛之前,计蒜客,还有蓝桥杯官方,有些模拟赛也会做做,找点感觉。省赛之前,再去poj上刷水题找点手感和信心。

       就这样,4月8日,期待已久的第八届省赛来了。省赛差不多就给今年的蓝桥杯定下了基调,那就是,与众不同。相比前几年前几道的送分题,今年前几道乍看都挺烦的。于是,我果断跳到后面题做了,之后才慢慢一道一道解决前面小题。代码填空还是比较简单(不过一道想当然我还是炸了),就不多说了。大题,第一道日期,就是普通的模拟。第二道还是第三道,一道包子的,类似于蓝桥杯历届试题里买不到的数目,我用的是官网给的视频里提供的解法,好像还有一个利用扩展欧几里得做的解法更好些。另外一道切巧克力的,则是二分答案。最后的k倍区间其实最简单,大意就是求共有多少区间使得其中数目和为k的倍数。这个先要想到用前缀和,预处理后可枚举i,j看s[i]-s[j]是否模k为0。这个算法时间复杂度还是o(n^2)的。所以,要用更好的方法。直接利用cnt数组,cnt[num]记录模k为num的前缀和的数目,边循环边更新,num也可以不断更新(注意对于某个i,j

      不多久出了结果,省第一进去,还是挺惊喜意外的。于是乎开始国赛的准备了(不过说实话后面我的准备好像还没之前多,基础的那些算法模板都有的差不多了然后就是些应用了。加上数学模型学校里有个什么选拔赛,也算耽搁了一段时间)。浪着浪着,快到27日北京国赛的日子。计蒜客打了两场比赛(一场205一场220,好像初赛每场前200入围复赛,这个贼伤),最后几天好像也没干啥,26日上午高铁出发,晚上跟同学“蜗居”宾馆,第二天上午比赛。

      按理说国赛题应该是很难的,去年c++的b组,后面大题每一道会做,而且甚至连骗分都不一定会骗。就算是简单点的java b组,那个第五题也是想了一段时间才写出来,但是按写前四道速度估计也怕是来不及写完了。然而今年好像就福利了很多。先说第一道,最大十位平方数(数码不重复),直接dfs搜索不解释。第二道细胞自动机什么的,看着烦,直接模拟(方法应该是这样,我的好像做错了)。第三道代码填空跟去年还是省赛题套路差不多吧(双目运算符什么的,注意程序中方法函数的理解和充分利用)。第四道加减乘除取模,进制转换,好像不用考虑优先级(可以随时输出结果)。操作是以字符串形式给出的,所以输入什么得判断判断。对于进制转换这个问题,我直接就用了java大数类(里面有方法可以解决不同进制数运算操作的问题)。以当前进制输出,某个toString方法里好像也含有个进制的参数。第五道两人每次找一空填(填L或者O)看先是谁填完一空后有LOL字样出现,应该是道博弈吧,可能要sg函数什么的,不太会,就直接用搜索做了。(主要思路,如果某个人存在一种操作使得剩下所有局面另一方都为负,则采取该操作。否则,就找操作看能否逼平对方。如果所有操作进行后均有使得对方获胜的局面,则负)。第六道估计是二分和贪心,这道群里好像有人给的一个例子我过不了,但我的程序样例还是能过的。题目大意,给定一些区间,加起来长度超过10000,问如何移位使得这些区间最后能覆盖[0,10000]这个区间,并且区间移位最多的那个区间移位距离最小。(最大值最小的其实就已经提示了用二分的方法)。我的思路是,先排序,区间靠前的排在前面。然后二分答案num,循环处理。第一个区间要移位使得起点为0,之后区间,如果在上一个移位了的区间之后,则先要左移靠到上个区间终点处。否则,就尽量右移(当然,要保证上个区间终点后不会出现中断情况)。这些题做了还有好像一个小时,啃着面包,喝着牛奶,其实早知道第二题还是应该再做做,有点浪了。不过说实话,今年题与前几年比也确实水。

      成绩第二天就出来了。虽说做的快,都做了,但觉得可能大佬们也是都早早解决问题,所以对奖项还是心虚。倒着看获奖名单,最后竟然是一等奖,第五名,也着实惊喜啊。明年还有时间的话,就去a组比比看吧。

你可能感兴趣的:(蓝桥杯)