第九届蓝桥杯(软件类)赛前60天备战分享会

  1. 一、 分享嘉宾

    1. 大赛特邀专家:于航(从第一届蓝桥杯大赛开始就是大赛的特邀专家顾问团成员之一,对蓝桥杯有着非常深刻的影响和了解)
    2. 第八届蓝桥杯国赛获奖选手:张浩威(国家特等奖)、黄诚博(国家特等奖)、柴文俊(国家特等奖)、辜思学(国家特等奖)、柳真(国家二等奖)、李文枭(国家二等奖)
  2. 二、 活动环节

    分享会的环节主要分为四部分:

    1. 蓝桥杯大赛介绍(分享嘉宾:于航)
    2. 备战建议(分享嘉宾:于航)
    3. 第8届国赛获奖同学经验分享
    4. 自由问答互动
  3. 三、 大赛介绍

    1. 大赛的特色:实战+趣味+、企业+ACM突出实战

      • 企业需要的是能够解决实际问题的人才,而非仅仅精通理论

        大赛和学校的考试很不一样。尤其对于初次参加大赛的同学,要适应这种模式,大赛突出实战,不考概念题、论述题、语法题等,而是让你去解决某个具体的问题,能够严格地去判定结果是正确还是错误的。这个判定是通过计算机来自动完成的。蓝桥杯的设计初衷,就是要在企业和高校之间建立一座桥梁,来解决现在就业、用人的悖论。

      • 趣味性

        大赛的题目很注重知识性和趣味性,具有开拓视野、提高兴趣这个作用。很多题目设计的很小巧、有趣,很值得一做。比如,考祖冲之的圆周率解法。这类题目通常不难,只要你认真、细致,基本功扎实,一般都可以轻松得分。

      • 企业要求

        企业注重能够解决现实问题的能力。大赛试题的设计正是以此为准则。代码填空题考验同学们读代码的能力,这个能力在工作中很重要。因为我们企业用人的时候,第一天到企业里参加工作,很可能不是写一个新程序,而是去维护已有的程序,而那个程序很可能是你的前任写的,可能离职了,这个程序可能写的也并不是很好,甚至是很烂,但是你要硬着头皮读下去,理解他的思路,并且能够修改他的错误,能够添加新的功能。所以说,读程序是很痛苦的,但是这种痛苦是必要的,读程序是很重要很重要很重要的(重要的事情说三遍)。硬着头皮去读别人的程序,可以使你很快地长进,跳出自己思路的圈子。理论和实际的可操作性有距离,企业注重可操作性。

      • ACM

        ACM的题目很难。而蓝桥杯大赛的题目,难度是有梯度的,就是说有些题目很简单,有些题目的难度和ACM一样甚至是超过ACM的难度。实际上,企业里大量急需的人才,并不是有ACM解题能力的顶尖级人才,一般企业里需要的人才是具备分析设计能力的人才。蓝桥杯大赛的设计是要突出大众性、普及性的特点。

    2. 比赛的形式

      比赛全程机考,没有纸质试卷。通过浏览器下载题目,提交答案。上图是同学们参赛时所使用的计算环境。考前要认真阅读考试须知。开考以后,下载题目是有密码的,输入密码的时候要注意大小写、中文等。同学提交答案可以边做边提交,避免都集中到考试快结束才提交。这样往往造成服务器压力过大,出现提交不上、网络出现错误等情况,造成不必要的损失。可以边做边提交。

    3. 赛程

      省赛4个小时,中间不休息。各省分别排名,按照一定比例进入决赛。

      决赛是全国统一排名次,也是4个小时,分上下午。

    4. 题型与评分标准

      题型一共有三种。初赛10道题或者11道题,决赛是5道题或者6道题。全程机器阅卷。特殊情况可能会人工干预一下。考试提交后不能立即反馈结果,可能以后会慢慢做到能够立即反馈结果。

      1. 结果填空题

        这种题目很简单,许多是送分题,只要结果、不计手段。你可以不去编程,可以使用excel、计算器等,只要是电脑里的资源都可以使用。答案一般是唯一的,多数情况下是一个整数。第一题尤为明显,被称为热身题。或者叫送分题。许多同学没有得分,可能是因为马虎、紧张、过于轻敌等情况。

        机器测评直接去比对你的结果和预设的答案是不是严格一致,所谓严格一致,比如人家答案是123,你的结果就不能是123逗号、123空格、中文123等。

      2. 代码填空题

        这类型题主要是考察选手阅读他人代码的能力,有的时候改一个程序比写程序还要困难,也很痛苦。这类题目肯定要先读懂题,你不读懂别人的思路,这个填空没法填,当然不绝对。有的选手没有读懂别人的程序也填对了,他是通过猜测、调试,把答案试出来了。这也是企业所欢迎的,能解决问题就是企业所需的人才。机器的评分过程就是把你填的代码代入到原来的程序的源代码里去,然后运行看看能不能得出正确的结果。不过,要注意的是,代进去的时候,源程序和题面的程序有可能是不一样的,题面数据有可能是用ABC这个串来做测试的,代进去的时候可能改成了XYZ,也就是说测试数据给换了一下,因为它要求你的代码要具有通用性。

      3. 编程大题

        结果填空和代码填空两种题型虽然数量比较多,但是占的分值并不是很多,分值主要集中在编程大题。编程大题要求必须要提交代码,代码必须经过编译通过、运行、得出正确结果,才能有机会得分。编程大题给的测试用例是许多个,可能有的题目能给出10个测试用例,每个测试用例测试过了,就得这一个用例的分数,每个用例是单独计分的。

        选手答题过程中,大题的失误也不少。比如,这个题目你能做出来的情况下,你在提交的环节失误了,这是相当可惜的。这里有一个典型的提交错误:比如C/C++组的同学在提交时需要选择使用的语言是C还是C++,你本来用的是C++,但是却选了C,造成编译不过。

        总的来说,大赛拿0分的人很多,每年都超过10%,有的组别最高能达到20%的零分率。然而很多人不是因为不会才拿了0分,而是因为一些低级的、不应该的失误导致的,比如有些同学在控制台操作、控制台命令这样的基本常识性的东西缺乏训练导致了失误。如果我们是初次参赛,一定要注意把基础打牢。

        另外有些同学有点好高骛远,一上来就做难题、做大题。大题是不好做的,又是编程又是在纸上画,最后没做出来,退而求其次,才去做难度比较低的题目,结果还是花了很多时间,把自己的心情搞乱了,最后剩下那些简单的题,也因为心情不好、紧张而做不好。所以,同学们在答题过程中要注意戒骄戒躁。

  4. 四、 备战建议

    1. 教材上划个范围?

      没办法划教材上的重点。大赛上真正考到的东西,占学校教程上的内容不到20%,实际用到的语法不足20%,所用到的语法也就是基本的选择、循环、赋值、数组、结构等东西,大赛真正要考的是算法。

    2. 算法是什么?

      算法的定义有广义和狭义,从广义上来说,算法即想法——解决问题的想法、编程的思路。所以,考算法,选什么语言区别不大,用JAVA还是C/C++都是一样的。 从狭义来说,分为不同的领域,相互之间有交叉有重叠,比如科学计算这个领域,算法的主要内容是研究线性方程组怎么求解、怎么对矩阵进行分块运算等;如果是可视化领域,和3D游戏就会有一定重叠,比如研究怎样做三角划分、着色、渲染、雾化等。通用的算法有很多,并且在动态地发展、添加。在比赛中想拿高分,那么需要对各个领域的算法都有所涉猎,尤其是一些前沿的东西,比如从博士论文、硕士论文、国外文献等出现的前沿讯息,都可能成为ACM的考核点。 但对于入门级选手来说,基本功才是关键、掌握基本算法。以真题的一个小例子进行说明 [真题:运动员分组] 短跑比赛,8条跑道。 运动员多的时候,要分组,要求:

      1. 组数尽可能少
      2. 每组间的人数差异尽可能小

      比如:人数=9,分组:5,4 比如:人数=26,分组:7,7,6,6 这道题,当人数少的时候,人工计算很简单,但是如果要将头脑中的计算过程通过计算机表达出来,就是成为程序员要过的第一关,即如何把人工能做的事情,转换成程序逻辑。解这道题的思路,可以用分豆子来类比讲解。将26颗豆子分到4个碟子里,一颗一颗分,每个碟子一次分一颗,最后,有两个碟子比另外两个多出来两颗豆子。碟子里的豆子数量的差距最多为1颗。这种算法,就叫贪心算法。 对于大多数普通本科同学来说,掌握好基本算法是一个比较合理的目标。在这里给出一张基础的算法分类图做参考,可以对照这张图,补补缺查查漏,看看自己还有哪方面能力有待提高。

    3. 怎样备战?

      不同的目标,有不同的方法,因人而异。

      参赛目标大致有以下三类: A、参赛体验,重在参与,能做上基本题就好 B、希望能进入决赛 C、希望能拿名次,获大奖 如果是上述第一种情况,那么要保证把暴力破解训练到位,尤其是多层循环的解题模式,要熟练。很多同学调侃蓝桥杯是爆破杯,实际上暴力破解并不是坏事。当进入到企业工作就会发现,那么高深精妙的算法不太能用到,一年也用不上几次,反而是暴力破解是天天写程序都在用的。此外,研究一下往届的大赛真题,上上练习系统,做一下基本题目。同时,推荐两本书,《Java大学教程》、《C++大学教程》。这两本书的课后练习题很有启发性,和我们国内教材死板的课后练习题很不一样,很多题也很有趣。 如果是上述第二种情况,这应该是大多数同学的目标,那么对暴力破解,要深入理解,除了循环,还需要熟练掌握递归,有一些递归基本的套路、基本的模式,要掌握。由于时间关系,讲座上就不展开了,可以网上搜索,自己学习和训练。在这里建议去研究一下小学的奥数题,很有价值,别小看小学奥数题,你未必能做出来,把小学的奥数题目用计算机计算出来,是一个很好的锻炼方式。推荐一个网站:欧拉计划。这个网站失血数学题目的,从很小的数学题到很难、很前沿的大型题目都有,可以一步步去训练。练习系统方面,蓝桥杯练习系统不用多说了,还有一个是青少年信息奥林匹克(NOI),那上面的题目相当难,对于没有经过任何训练的同学来说,很可能会的0分。

      如果是上述第三种情况,想拿国一、国二,就需要上ACM的训练网站,各高校都有OJ系统,北大、杭电、交大等。 提醒同学们在备战过程中不应该好高骛远,有些同学一上来就刷题,对刷过的题目,看看答案,似懂非懂就放过了,下次再碰到类似的题目,还是不会。所以同学们在学习和刷题的过程中,不能片面追进度、追速度,囫囵吞枣三个算法,不如研究透彻一个算法,把这个算法的精髓和精神彻底弄清楚。所以同学们一定要脚踏实地,千万别好高骛远。

      另外,把历届大赛题目练好研究明白也很重要。每一届大赛有6个组别,每个组别有10道题,虽然有重复,但题目的量也很大了,把5-6届真题的题目都练完,是很有必要的,可以在开考前的半个月或者10天,把这些题再做一做,找找感觉。 对于一般本科生,一定要注重基本能力和技巧的训练培养,例如:IO重定向、日期问题、散列法、枚举、缓存等,由于时间关系,讲座上就没办法具体去分别展开讲述了。 对于一般的选手,想拿高名次的话,应该去看一看ACM的入门书,比如刘汝佳的系列,比较易懂,适合入门选手。选手选书的原则:自己能看懂,题目做起来对自己而言不是太难。在此基础上进阶,比如准备过ACM、想拿靠前名次、特等奖等,可以系统的学一学数学基础(整数数论、复数与解析几何、组合数学等)和数据结构。推荐书籍:《算法导论》、《具体数学》。练习系统方面,国内外的ACM练习网站很多,还有大赛决赛的真题也可以做一做。

      关于学习方法,额外建议:

      • 立即行动!书非借不能读。 学习有规律性,要持续、累积,养成学习的习惯,而不是下决心就行。不要妄图买一本多厚的书、拷贝多少资料迷惑自己能学好就行。要立即行动,现在就去学习。
      • 你不是一个人在战斗 结对编程 —> 结队编程 一个人学编程很痛苦,很难坚持,最好找一个同伴一起学习,比如宿舍同学、同班同学、网上的好友等。编程虽然很痛苦,但越来越有价值。人工智能现在这么火,将来身边的智能设备会越来越多,需要很多程序员编程才能把这个庞大的需求量保证好。 结对编程:一个人写程序,另一个人在旁出谋划策和提出建议,两个人之间就会有观点和思路的碰撞、反馈。在国外,这种编程方式很风靡,但在国内还没有企业采用,可能出于成本考虑吧。 不要错过在网上参加某个讨论组或者学习群的机会,结伴学习。
      • 一夜间就成为程序员 变成技巧需要积累才能发酵,不能急功近利,需要思考、经验积累,有一个量变到质变的过程。 上述总结起来:找个伙伴,跟个社团,不要怕慢,坚持修炼!
  5. 五、 学生嘉宾参赛经验现场分享

    1. 李文枭,上海理工大学,第八届Java软件开发大学B组国赛二等奖

      我觉得学习算法首先要将基本的理论知识过一遍,如果有些学校算法课开的比较晚的话大家可以到coursera这些慕课平台上进行学习。 基础打好之后找到自己的学习薄弱点然后进行大量刷题并及时总结就可以了。在刷题过程中,尽量找志同道合的同学一起训练,如果学校有算法集训队,能够加入是最好不过了。当练习一道题被卡住很长时间的时候,尽量多找同学交流,不同的人有不同的思路,别人的一些想法很容易给我们一些启发。 要提一点的是有些经典的算法大家要熟悉一下,比如代码填空题曾经有考过快速排序和KMP字符串匹配算法,如果大家很熟悉的话可以马上填出来,节约大量时间主攻后面的编程大题。 另外,大家也要注意自己的做题策略,先做自己有把握的题目,能把自己会做的做对已经能有很不错的成绩了,剩余自己把握不大的或者没有思路的,考虑很简单的情况,毕竟通过每组数据都是有分数的。

    2. 柳真,中南民族大学,第八届Java软件开发大学B组国赛二等奖

      就我自己学习算法来说,我感觉前期关于算法基本概念基础学习过程很重要,比如理解弄懂基本排序类算法,比如选择排序、冒泡排序、快速排序和合并排序等;其次,就是理解相关算法思想,比如蛮力法、贪心法、分治法和动态规划法等;做完上述基本学习后,做做一些经典的算法题,比如八皇后问题呀,加深自己的理解。这些过程过后,再针对相关比赛,做专项习题训练,效果会很好。比如按照蓝桥杯模式,重点练练DFS,BFS算法,回溯也好好研究,再重点研究一下比赛真题,拿个好名次,不难。

    3. 辜思学,成都东软学院,第八届C/C++程序设计大学B组国赛特等奖

      首先,对于C和C++组的同学,应该先学一下C和C++的模板库,就可以开始练题了。接下来更重要的是找题和刷题。我推荐刘汝佳的《算法竞赛入门经典》,这本书被称为小紫书,这本书我认为是很基础也很有用的,里面的例题建议都做一遍。如果这本书还会觉得不够的话,可以再做他的大白书,算法竞赛入门经典的训练指南。最后,一定要花时间去刷一下蓝桥杯练习系统,熟悉一下历年真题。 接下来我就以我的比赛经验来简单我当时是怎样备战蓝桥杯,比赛现场是如何想的、如何做题、如何得分的。 开始的题是结果填空,这种题主要使用各种各样的方式去暴力做,什么交各种各样的方式呢?你甚至可以用命令行里面的计算器、用EXCEL表格,甚至用手算都可以。(老师插播:手算允许,只要不是抄的,或者没被抓住……) 第二部分题目是代码填空,需要将其中的代码拷到编译器中,模拟看一下这一行就是要实现什么,最后一定要运行去测试一下极限数据以及边缘的数据。这部分题目,少量是经典的算法或者是改编,所以平时需要熟悉注意去熟悉经典的算法。 最后的答题是直接编写完整的代码去实现特定的结果。如果没有一下子发现更优的解法,你要先写暴力,先把暴力的交上去,然后再看是否需要最优的解法,因为某些题,用暴力就可以解决。如果需要更好的解法,并且你找到了他,那么你最好将这个最优的解法和暴力进行对拍。如何对拍,你网上一搜,就可以搜到。根据对拍的解法,去算一下你提交对拍的代码还是暴力的代码,哪一个更优。

    4. 柴文俊,青岛理工大学,第八届Java软件开发大学B组国赛特等奖

      首先做题,对于小白来说,算法没怎么学全,就针对每一个算法一套一套题去做,把它们全部搞明白。我个人对于把这些题搞明白的方法是,写博客。以产出来衡量自己的努力,比如可以以写博客的数量来衡定自己到底学了多少算法,这是一个双赢的事情,除了能提高对算法的理解之外,还能提高自己的写作能力。 如果你参加了ACM的话,你就应该多培养比赛的状态,如果你是ACM精英队的,那么比赛就应该是常态,我个人针对蓝桥杯,参加了三届蓝桥杯,大一比较水,大二时我觉得能拿个国家一等奖,但只拿了国家三等奖,我觉得是因为状态没有很好。然后第八届比较重视,提前两三周基本上就在培养比赛状态。值得一提的是,比赛的前一天晚上,我留了上一届JAVA B组的国赛真题平时没做,就在考前一天晚上做,做到了大概一等奖的水平。 书籍方面,我也推荐刘汝佳的《算法竞赛入门经典》第二版,这本书对小白来说算是比较友好的,前几章是非常友好的,后面几章也会比较麻烦。这本书有很多编程的小技巧,题目也比较基础。还有一本书叫《挑战程序设计竞赛》,第一版,这本书我没有跟进去学,但我看它的代码还是不错的,算法分类也分的挺好,这本书也可以买来学习一下。 然后就是刷题,我大一时候刷的是北大、杭电的OJ,还有是中文的NYOJ。题还是要多做。 比赛的时候,要尽量做到最后,做到比赛结束的最后一秒,那样的话我觉得能思考的更多。以我为例的话,第8届的蓝桥杯的B组,总共是4个小时的比赛,我一直做到了3小时55分钟。

    5. 张浩威,北京大学,第八届C/C++程序设计大学A组国赛特等奖

      比赛整个过程可以分为考前、考试和考后。现在离考试还有60天,这60天我们能干些什么?如果说能从早到晚一直刷题的人,比如我高中的时候是一天做10道题目,以这个速度做题的话,60天就是600道题,其实每做10道题,人生就会迈向一个新的台阶,如果这么干的话,做完这600道题,那么我相信那一等奖是没问题的,当然在过年期间,需要走亲访友,同时各自也有各自的学业,刷600道题不太现实,刷两三百道题比较现实一点。有些同学平时有准备有积累,在最后冲刺一下子刷两三百道题太伤肝了,那么需要一些技巧性的训练。首先是先去了解大赛的规则,刚才老师和学长都说了题型,那么我们就需要根据题型去分配时间。根据经验,初赛有一半的题目是可以通过暴力来解决的,后面的题目,最难的也是通过搜索。所以我们在这60天,就多去练习这些通过模拟整个过程或者通过简单的搜索就能做出来的题目。说起来这个方法非常简单。但是我们要注意,蓝桥杯的赛制比较特殊,我们既要保证速度,又要有准确度,所以我们要根据这两方面来进行针对性训练。我们来说一下速度这个问题,首先是比别人做的更快更好,怎样才能做得更快呢?打代码的速度是一方面,还有一方面是要把代码在你脑中形成一个体系,比如说我先写什么、后写什么、最后写什么,一旦形成了这种体系之后,那么写代码的时候根本不需要用到脑子了,你只要先用脑子,之后就把脑子隔开,用手就可以了,这样你的代码一定会非常快。然后我们再来说一下精准度的问题。这个怎么训练呢?在平时看到一道题目时,肯定要上传到OJ来评判自己是否对。这时候要尽可能让自己第一次提交就通过它,这样在比赛的时候可以大大提高自己的正确率。还有刚才学长所说的,可以通过对拍,对拍就是你写一个暴力,然后再写一个暴力,然后两个代码跑一跑,看一下是否有错误。如果两个代码跑起来的结果不一样,那肯定其中一个代码是错的,除非你两个代码都写错了,并且错在同一个地方,否则你基本上有大概率有一个是能对的。 以上是考前的训练方法。接下来再说一下考试的时候如何发挥。只要把考前自己训练的体系给发挥出来就没有什么问题。考前给自己定个小目标,比如是二等奖或者一等奖,然后考试时大致估算一下难度,比如前三题看起来比较简单,第四题开始慢慢难起来了,那么基本上就是把前三题做完你就二等奖了,然后把第四题做完你就一等奖了,这时候只要保证最简单的那些题目不错,能达到你的目标,这时候就可以放松心态了。 然后再说一下考后,当时考完见到一个人我就说我考挂了,当时确实6道题有3道不会做。当天晚上老师发来信息说我拿了特等奖。所以说考后不用太在意自己考得怎么样,吃顿火锅回家等好消息就可以了。 最后建议大家熟悉一下比赛的平台以及题目的格式具体是怎么样的,刷两三套往年题,到比赛的时候轻松地发挥就可以了。

  6. 六、 自由问答

    详见《蓝桥杯60天备战分享会问题解答(软件类)

Spread the word. Share this post!

Leave Comment

电子邮件地址不会被公开。 必填项已用*标注