博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

信息学奥赛分区联赛复赛经验谈

Posted on 2010-10-22 21:41  桃子在路上  阅读(503)  评论(0编辑  收藏  举报
 
我初三第一次参加信息学竞赛,复赛只得了40多分。我完全有能力得更高的分的,但由于经验不足就...所以呢,我实在不忍心看到大家步我的后尘,因此在这里我就随便写一点自己的体会,希望对初学者有点帮助。

一、认真审题审题
对于信息学竞赛来说尤其重要。同一个题目如果数据限制差异大的话,可能难度差异也很不同。例如:输入A,B,输出A+B的值。如果题目说0<=A,B<=10000,这道题目无疑是一道很简单的题目,但如果题目说0<=A,B<=10000000000000000000000000000000000000000000000显然就要用到高精度数的处理了。
从某种意义上说,数据限制也暗示了你可能的算法。数据小,也许是搜索派上用场的时候,数据大了,可能只能考虑动态规划,数学方法等高效的算法了。

二、编码和调试的能力
去年复赛的时候,我身边的那个选手,打键盘的声音特别大,引得我转过头去看他。这时,我正在写第一题,他已经写完开始调试了。我暗想,可能这是个极有竞争力的选手吧。当我完成第三题是不由自主的又去看他,竟发现他还在调试第一题。如此调试能力,试问如何能得高分?复赛考查的算法并不困难,选手在实现上的问题往往还要大一些。建议(我一直是这样做的)大家: 
一,充分利用草稿纸,不要对自己的“心算能力”太自信了
编程熟练的同学喜欢“一气呵成”,拿到题目就开始编码。我认为这样不好。做信息学竞赛竞赛题的思维过程是丰富而曲折多变的,考虑问题必须全面。仅凭一时的“感觉”来编程往往是漏洞百出。初学者常常忘记做一些初始化工作(远不止变量赋初值这种最简单的),即使有经验的同学也难免因一时疏忽写出几个错误的语句。最要命的是“第一感觉”的算法是错误的或者效率太低,而程序编了大半才发现...做一些复杂的题目(以前复赛的题目其实没有特别复杂的,但今后可说不准),大多数人多会在一分心的时候突然短了思路,不知道下一步该写什么了。
二,编码采取自顶向下,逐步求精的方法,调试时采用输出中间结果的办法及时找出错误的地方。可以这么说,思路越清晰,对自己程序的算法和编码越了解,调试也会越顺利(一定不要忽视)

三、最大限度的发挥自己的水平
看上去是废话,但我必须说,当临近比赛的时候,这一点绝对比提高自己的编程能力重要和实际的多。下面我谈谈从这几届分区联赛中得到的一些启示。

1.正确的估计题目的难度和自己的水平
初学者常常“意气用事(借用一下这个词吧)”,拿到一道看起来很“爽”的题目就开始做了,其实这样不好。记得NOI99第二试的时候许多选手一开始就做第三题 - 模拟题,看起来简单,其实要做好并不容易,所以 - 不少人用了4小时都没有做出来,只好...我虽然先做的第一题,但做完后也是去做第三题,做了3个小时却因为粗心...所以说,必须在平时训练一下对题目的规模,难点,编程调试复杂度等方面的估计,还要注意自己擅长哪方面,编程速度和准确度以及调试能力如何,结合自己对题目的估计,方能正确的选择题目和安排时间。

2.重视测试
能够做的题目常常得不了满分,这也属于发挥欠佳。但其原因不是自我估计不准,而是考虑问题不全面。一道自己有把握,有信心做好的题目一定要花大力气保证其正确性。记得NOI99第一试,我第二题“几乎”编正确了的,却因为初始化有误,我测试的数据可以通过,但评分时用的数据无一通过:( 。这是因为我的测试数据太特殊,没有反映出程序的缺陷。明白了吗?想想我的失败,大家一定要重视测试啊!测试技巧请看“信息学学与练”的相关文章。

3.评分的唯一标准是测试数据
我不是鼓励大家“投机取巧”,我的意思是,一道困难的题目如果无法下手,在时间允许的情况下一定要写一个能解一些特殊情况的程序。例如去年分区联赛《旅行家的预算》一题,无解的数据和没有加油站的数据各一个,难道对于这两个情况的程序你还不会编吗?得一些分算一些嘛。还有“导弹追踪”一题有一个数据是升序排列的,难道你不知道这种情况是一次只能打一个吗?很多最优化题目,不要一个字都不写,根据你的“直觉”算法(例如贪心),虽然得不了满分,也能得一定的分数。反正又不是写解题报告,得多少算多少。

4.不怕一万,就怕万一
和编程序没有什么关系啦,我是提醒大家要多存盘什么的,最好保留一些不同版本(例如算法不同)的程序,便于选择修改。不要不当回事,小心点总是好事。我上次就因为...第二题编了两次(好在只多花了10分钟)

5、怎样准备复赛?
1.应该针对自身特点在时间不多的情况下,应该针对自己的特点来准备。下面是一个简单的自我评估方法
1.你参加过复赛吗?
2.你做过以前的竞赛题吗?(没有做过就在本站下载一份去做嘛!)
3.你知道复赛如何评分吗?
4.在算法十分熟悉的情况下,你平均输入100行代码需要多少时间?
5.你对那类题目最有把握?
6.你对那类题目最头痛?
7.程序编完后,调试成功需要的时间平均是编程时间的几分之几?
8.你满认为正确的程序,结果测试下来有错误的情况有多少?
9.你满认为正确的程序,结果测试下来几乎得0分的情况有多少?
10.你看完题目(包括验证样例数据)的平均时间是多少?
11.从看完题目到脑子里浮现出第一个算法的平均时间是多少?
12.从看完题目到最后决定采用哪种算法的平均时间是多少?
13.从决定算法到开始编码,你会先在做准备工作(eg.写伪代码)吗?需要多少时间?
14.在实现算法的时候突然发现算法是错误的,这种情况有多少?
15.程序编完后测试一些数据后发现算法是错误的,这种情况有多少?
16.程序写着写着写不下去了,因为觉得代码还需要写那么那么多...这种情况有多少?
17.程序写着写着写不下去了,因为不知道下一步该写什么了,这种情况有多少?
18.程序写着写着写不下去了,因为刚刚写过的代码突然看不懂了,这种情况有多少?
19.程序写完了,运行失败,你先静态查错,还是直接调试?
20.调试通一个100行代码的程序,你用的时间平均是多少?
21.调试了一段时间,仍然通不过,不知道该怎么办,这种情况有多少?
22.终于调试通过,竟然是笔误!这种情况是多少?
23.对于竞赛题,你有把握同时通过的程序有几分之几?这种“把握”通常是正确的吗?
24.你测试程序吗?是否只是使用样例数据?
25.测试时死机。这种情况有多少?
26.测试大数据时才发现你的程序效率存在严重问题,这种情况有多少?
27.测试大数据时才发现你的程序空间问题没有解决好,这种情况有多少?
28.测试一个数据失败,调试通以后你是否进行回归测试?
29.一般的题目你会花多少时间测试?
30.做一道简单的复赛题目,你一般需要多少时间?
31.做一道中等难度的复赛题目,你一般需要多少时间?
32.做一道困难的复赛题目,你一般需要多少时间?
33.平时做题你计时吗?
34.想好算法以后,你能较为准确的估计你将花的时间吗?
35.看完题目以后,你选择对于你来说最简单的题目吗?如果是,选择正确(的确比其他题目容易得分)的时候多吗?
36.对于不会做的题目,你能够想一个方法拿部分分吗?
37.你设计的测试数据和标准测试数据是否比较接近(指测试的方面,不是数据本身)?
想一想,这些问题本身也许就可以引起你的思考。
选出你认为最重要的,你又最差的方面集中训练。

2.熟悉复赛的形式,内容和题目的特点
复赛题目的特点是:
第一题:算法比较明显的,或者和数学关系比较大的题目。
第二题:好上手,但程序量要大一点的题目,考虑全面也不容易。
第三题:一般是搜索,或者算法不明显的题目。
    算法方面,可能考到的是:搜索(回溯就可以了),动态规划(几乎是必考),贪心,递推(小心真的考到哦),递归...数据结构反而考得不多。熟悉字符串的操作和排序算法就差不多了。
练习以上内容可以做以前的复赛题或我的模拟题(难度比复赛略高一点)

一个好的方法是练习经典题目。
如:8皇后, 汉诺塔, 部分背包问题, FIBONACCI数列, 数字三角形...还有很多,我一时也想不起很多,主要还是靠平时积累。

3.选择自己最有潜力的方面专攻
初学者是一般不可能做出所有的题目的,应该选一些自己平时最熟悉和有把握的题,一定要做对。记住,信息学竞赛最容易出现“一失足成千古恨”的情况。自己熟悉的题目要加强编程熟练度,准确度,测试和调试能力,把自己有能力拿到的分拿稳。假如我最近对回溯很有“感觉”,我就应该多编一点回溯的程序,如8皇后,BETSY的旅行,马的周游,图的着色...把它练熟。