• oi大佬经验分享


     

    凭什么我得了信息学奥赛国家一等奖  (有删节)

    山东省莱州一中 姚 远

    2005年5月中旬,在犹豫了几个月后,我终于决定退出信息学奥赛。随后我交还了手中所有的图书资料,搬出了601宿舍,停下了所有的辅导课……脑袋空下来之后,过去的事开始不断闯进我的脑海——那不明白的许多事情,还有悬而未决的问题——我真想解决它们啊。至少我也要弄明白有些事为什么会发生,为什么会变成那样,而我错在什么地方。加之我的时间也不像过去那样紧张了,于是我开始慢慢整理过去。这期间,我明白了许多。

    2005年11月,我还是参加了第十一届全国信息学奥林匹克联赛。不过参加这次比赛的目的并不是为了争取更好的成绩,我是想重温一下过去。在从日照回莱州的车上我开始写这篇文章《凭什么我们信息学奥赛先出国家一等奖》。之所以要写这么一篇文章原因有很多,主要三方面:一是基于对过去的反思和体会;二是参加了一段时间的另一科奥赛辅导使我横向比较认识到一些问题;三是看到莱州一中我和王福龙之后的几位oier(信息学奥赛参加者)的发展,纵向比较也让我深有感触。基于上面三个原因,我决定写这篇文章。

    一. 三个基本数据

    搞信息学奥赛要整日和数据打交道。我们喜欢“真实”,不喜欢“虚假”。我们只重视事实和真实的数据。因此在考虑该用什么方式呈现这篇文章时,我决定不讲空话。要让人信服,我只摆一些“数据”和“事实”。

    凭什么我们信息学奥赛先出国家一等奖,从以下几方面的数据可以找到答案。

    1. 时间

    “时间”时衡量做功多少的一个常用的量化指标。就像天津市一位老师分析的那样:“要想取得国家一等奖至少要调够200小时的代码。”要想拿国家一等奖,首先必须投入大量的时间。我们的投入有多少呢?我们几乎挤出了所有可有占用的时间,多的时候每周活动30节。班会2节,体育2节,信息技术2节,活动2节,自理课2节,音美课1节,星期六晚自习4节,以及部分自习课,在比赛前夕,可能还会有更多的自习课被吃掉。而在校外,如寒暑假,我每天的学习时间平均超过12小时。这些时间加起来有多少?高一下学期,为有更充分的时间学习奥赛,我们将宿舍搬到了六楼值班室。这里我们可以不受学校作息时间的限制,我们可以在每晚10点熄灯铃后继续开灯学习。每晚我们会学多少时间呢?我不敢讲。但值班的老师和巡夜的警卫一定知道。

    就是这样的时间投入使我们有可能触及国家一等奖。

    2.

    开始学信息学奥赛时资料稀缺。那时想要找一本PAScAL语言的书都很难。我看的第一本信息学奥赛的参考书时一本80年代的老书,纸都发黄了。即便是这样我仍感到非常难得,至今我还保留着那本书的笔记。上高中后为找书我们想尽了办法:邮购,托人捎,出去比赛时我们总要先搜一下当地的书店。所以一年下来我们还真积累了一笔不小的“富”。高一下学期我从601向办公室搬书,最下面的书在腰处,最上面的书到了下巴,这就是我们一年来读过的参考书,就这么多。

    今年我曾让周恩朋整理了机房中现存的书。(见表1)这些本书共有19本,价值364.75元,按书后的印刷信息统计至少有676万字。而我们一个学期的所有教科书加起来也不过200万字吧。而且大家能感觉到读懂编程书上的10个字和读懂教科书上的10个字是不一样的。

    (表1)

    书名字数/千字定价

    1奥林匹克数学中的组合问题42823

    2高等数学3573.25

    3组合数学39219.8

    4数据结构题集1683.9

    5离散数学导论2209.2

    6图论及其应用33412.8

    7算法艺术与信息学竞赛64145

    8信息学奥林匹克竞赛指导——组合数学的算法与程序设计29819

    9信息学奥林匹克竞赛指导——图论的算法与程序设计25816

    10高中计算机竞赛解题指导31114

    11新编奥林匹克信息学竞赛指导:数据结构与算法设计41218

    12信息学奥林匹克教程·语言篇36624

    13信息学奥林匹克教程·基础篇36624

    14信息学奥林匹克教程·提高篇43724

    15全国青少年信息学奥林匹克联赛培训教程(一)

    16全国青少年信息学奥林匹克联赛培训教程(二)36423.8

    17全国青少年信息学奥林匹克联赛培训教材(中学)44528

    18金牌奥赛兵法·信息学(计算机)31017

    19程序设计:高级程序员级65340

    以下书是后面买的,我没有看,也没有将这些书加入统计之中

    数据结构:c语言版50922

    计算几何——算法分析与设计44429

    PASCAL语言程序设计54016.4

    PASCAL程序设计3754.15

    全国信息学奥林匹克联赛试题精解24218.6

    高级语言程序设计38418

    程序设计基础 数据结构算法及应用35015

    全国青少年信息学(计算机)奥林匹克分区联赛试题解析(中学)47128

    信息学(计算机)奥林匹克(高级本)47824

    上面的统计只是一个很保守的统计。那些现在在其他oier手中的书我无法统计到。至于计算机和网上的我们看过的论文、讲稿、解题报告、试题讨论和电子书我就更无法统计它们到底有多少了,只是从文件夹属性上我看到它们有500M。这些书籍资料加起来就是我们取得国家一等奖的知识基础。就是这些。

    3.

    解一道信息学奥赛题和解一道物理或数学题是不可同年而语的。你若是知道3个小时的比赛时间只要求解决4道题,你就可以想象解决一道信息学奥赛题需要耗费多少时间和精力。从参加奥赛到现在我一共做了多少题,这无法计数。不过我觉得单数一下那几个比较大的题库中的题就不少了。我们做过几个比较经典的题库,如“济南培训52题”、“历届联赛复赛试题”、Poi(Poland Olympiad in Informatics)、TJU、USACO等。TJU是一个在线评测系统,是王福龙主攻的题库。这个题库共有200多道题,王福龙解决几乎所有问题。(因为TJU网站因故已停了近4个月,所以我查不到具体的数字,这是询问王福龙的结果。)参照3小时解决4道题,你可以计算一下单做这个题库要用多少时间。USACO是我后半段时间主攻的题库,这是美国计算机协会(USA computer organization)专门为青少年信息学奥赛辅导而设立的题库,不用说,这肯定是全英文的题库。读懂英文题,解决,提交,评测,你可以想象要花费多少时间。

    还有学许许多多书上的,模拟赛上的,讲稿上的题目,我无法统计有多少。不过我们可以从另一个角度评估一下我们做题的多少:离开新校前我拷贝了我机器上所有的程序代码,然后用计算机自动统计了我写的代码行数。得到的结果让我自己也吃了一惊,我在106号微机上共写了27257行代码。而我曾看过的代码(包括别人写的)共有46239行。我想考过二级或学过写程序的人都会明白这两个数字的意味。写了这么多代码,我觉得我应该拿国家一等奖。

    列了这么多数据,我觉得这只是“表面”而已,只是能看到的东西。这些只是我们为取得国家一等奖而付出的努力,而为什么我们能付出这种努力——为什么我们能挤出时间,为什么我们能看那么多书,为什么我们能做那么多题——内心深处的主观原因才是我们能拿国家一等奖的根本原因。那么这些内在的东西都有什么呢?我觉得至少有三大点:一、自觉和强大的自制力。二、激情和强烈的动机。三、能稍微吃点苦。

    二.三个基本要素

    1.自觉和强大的自制力。

    客观讲,自觉和自制并不是拿国家一等奖最重要的保证。但之所以将其放在第一位是因为这是最难做到的一点——特别是对于信息学奥赛的选手。

    我觉得自觉应该包括两个方面:自觉做该做的事,自觉不做不该做的事。由于奥赛基本上是和日常课内学习脱节的,并不像课内学习那样有老师、考试等一系列监督评价机制,因此学习奥赛有很大的自由度,有许多自主学习的时间,学与不学全凭自觉。对于信息学奥赛这种自由就更大了。实际上在信息学奥赛这边,一直是我们自己定学习计划,定内容和进度。杨老师的巨大作用体现在帮助我们搜集资料、解决问题、协调关系三个方面。杨老师一直很信任我们,她很少抽查我们是否在学,学了什么或学的怎么样。所以在这种监督很少的自由环境下如果你不够自觉,你是很容易效率低下,走神,甚至偷偷干不该干的事。

    那时我常去微机室,不少同学都问我在那里干什么。我说我在那里调程序。他们又问我你是否可以随时用电脑,可以上网?我说可以。这时他们总会偷笑着说“你们太幸福了……”我知道这句话是有言外之意的。在他们看来我们幸福是因为我们有条件做许多他们要想尽办法才能做的事,比如玩游戏,上QQ,看电影,看球……对我而言这真是太容易了,只要轻点两下鼠标一切都可以实现。可是我可以毫无愧色的说,我从来未在机房里做过那些事:我没有玩过一次游戏,一次也没有,哪怕是“扫雷”那种小游戏;虽然我经常上QQ,但我只是利用QQ和老师和全国各地oier讨论问题,我从未用QQ交过什么网友等等;我上网搜集的信息都是和奥赛或学习有关的,我没有看过什么娱乐新闻,也没看过一次比赛;我没有看过一次大片消遣,我唯一放松的方式就是听歌,那也是在很累的时候,实际上我的主机箱上基本不插耳机……因为杨老师有自己的教学任务很少有时间监督我们,所以做到上面几点只能靠自觉。想想那些在微机课上费尽心机想脱离老师监控偷偷上网的学生,你就能明白抵挡住网络的诱惑力需要多少自制力——特别是在没有监督的情况下。

    现在你或许能明白,我开始列的那些数据并不是虚构的“奇迹”,他们是靠自觉和自制从1 1开始积累起来的。垒到一定高度,自然会够到国家一等奖。

    2.激情和强烈的动机。

    许多人把我参加信息学奥赛的原因归结为一种兴趣、爱好。可我说这“苦差使”可真没什么兴趣或爱好可言,尤其在一中这种氛围下,尤其在一片反对声中。五年比赛,第3年才冲出莱州市,第4年才拿到国家一等奖,中间那么多失败和挫折,没有点激情没有强烈的动机,真的很难坚持这么久。我想这也是我们和其他科奥赛选手差别的地方。我们并不像他们只把奥赛当成一种老师安排的课外学习,我们真的把奥赛当成了生活的一部分,全身心的投入,梦想一个美好的结局。或许我和王福龙的一个差别也在这:我的动机比他强烈,目标更明确——就是要拿国家一等奖,不惜一切代价要拿到。我觉得正是这种激情地投入使我能释放全部的潜能,把力量拼到极限,投入那么多时间,看那么多书,做那么多题。当然我和王福龙在目标和动机上的差异并不是凭空产生的,这是由我们所处的环境不同造成的。一方面,我强烈的动机来自压力,因为那时我遇到的反对和阻力比王福龙多很多,因此我的压力很大。我告诉自己我必须在今年(2004)拿到国家一等奖,这样我就能早点退出奥赛,结束和父亲的对峙。是这种压力转化为动力拼出了全力。另一方面,我比王福龙更现实一些,或者说更功利一些:拿国家一等奖的目的就是为了保送或加分,否则我不会牺牲宝贵的学习时间发展“兴趣”。我常说国家二等奖的第一名和省三等奖的最后一名并没有差别,因为他们一样没有保送和加分资格,而只有国家一等奖可以保送或加分。因此我没的选择,我只能拿国家一等奖。现在看来我的思路对的,没有这样明确的目标和强烈的动机,我拿不到国家一等奖,至少不会在高一就拿到。

    3. 能稍微吃点苦。

    搞奥赛的那段时间里,我常拿出一篇文章来读。这篇文章就是我期末考试期间贴在墙上的那篇文章《人必须要有点精神》。文章讲的是中科院计算机所“龙芯”课题组的故事,讲中国第一块高性能CPU诞生的经过。文中有许多打动我的话,给我很大的激励。像下面这段:

    有好几次,他在早上六、七点钟打开实验室的门,发现有些人手里扶着鼠标就靠在椅子上睡着了。这样的场景常常使他忍不住想落泪。但胡伟武还是叫醒伙伴们,询昨天晚上的进展,并鼓舞大家接着干——他开玩笑说,有时候觉得自己比“周扒皮”还狠。胡伟武有一个叫张福新的学生,在龙芯验证芯片出生前的两个月中,很少在凌晨4点前睡觉。有一次,他们在深夜等计算机的运行结果,聊天时说到了生死。张福新说最不希望老死,看着自己的生命一点点被耗尽。

    还有胡伟武的一段话:

    胡伟武动情地说,我们有一种观点,我们现在落后这么多,别人不比我们笨,如果大家都一样一周五天,一天8小时上班,恐怕很难赶上人家,惟有像当年搞“两弹一星”一样拼命,至少得累死一批人,中华民族才可能不受压制,才有可能实现民族的伟大复兴。

    我感觉我还是从这篇文章中“稍微”学了点吃苦精神。之所以说我是“稍微”吃苦是因为我真不敢把我吃的这点苦和他们吃的苦相提并论。但我却不是一点都未付出,就像前面说的,高一一学年我几乎停掉了所有体育、活动、自理课,这些其他同学最幸福和期盼的课却不属于我。记得高一下学期停下奥赛辅导后,我第一次上了一节自理课——那也是那个学期最后一节自理课了。回到宿舍我躺在床上看外面刚下过雨的白蒙蒙的天空,我感到了一种很大的幸福——对比那些在计算机前抓着头发冥思苦想的“自理课”,对比那些眼睛被电磁辐射烤的干涩的“自理课”,我真的感到很幸福,这样简单的幸福,能在自理课回宿舍躺躺的幸福。

    还有一点,我想班上的同学也会有印象。那时我和王福龙的晚饭经常只是一碗方便面。当时下午第四节我们常在机房,晚自习第一节又常有副课自习。遇到这种情况我们常常不去餐厅吃饭,一直靠到六点半再到科技楼下的商店买方便面,在办公室泡开。就是等面泡开的这段时间我们仍要抓紧时间做题,或咬着叉子讨论问题(王福龙的这个形象给我留下了很深的印象)。有几次讨论太投入忘了那边还泡着面,等到想起来时面已经烂的可以了。我在家中本来已经养成了吃完饭半个小时内不做任何运动或学习的习惯,但在那时也只能打破了。吃完饭我只能听一首歌当作休息或做一些整理文件夹这样的相对不太用脑的事,这就算休息了。有时我们调程序实在到了关键时候,往往连面也不去买了。一直要等到下第一节课我们赶回教学楼上第二节课再顺路买一碗面、泡上,下第二节课课间再解决掉。那时化学老师真好,有一次她发现了我们这种情况,竟让我们在她的课上先吃饭,真太感激她了。不过说句实话,空着肚子上课和胀着肚子上课感觉一样不强。

    那时教室里经常弥漫着一股方便面的味道,真对不起我的同学们。

    还有那段601岁月,还有那段早上4点半起床补课的岁月……想到这些我才敢说我们确实“稍微”吃了点苦。一点苦也不吃,没人能拿到国家一等奖,就是这样!

    从科技楼到教学楼的这条路,不知“跑”了多少遍

     

    六.信息学奥赛的知识能力体系

    数学离散数学集合论 关系 代数系统 数理逻辑 图论

    组合数学排列组合 母函数 群论 递推与递归

    数学规划线性 动态 整数

    高等数学向量 行列式与矩阵 微积分初步

    概率统计

    初等数论素数 整数理论 同余与模线性方程

    计算几何

    数据结构存储结构线性表

    (一级结构)静态:数组 栈 队列 广义表 字符串

    动态:指针 链表 动态数组

    (二级结构)表示法(静态、动态) 二叉树 森林

    (三级结构)表示法(矩阵、邻接表、三元组)

    特殊结构散列表(HASH表) 并查集 线段树 后缀树 哈夫曼树与哈夫曼编码 地址表 Bit图 滚动数组 棋盘图 边顶置换图 二分点图(网络流)

    常用方法遍历树 图 前/中/后序优先

    转化拓扑排序(三级结构转一级结构) 最小生成树 最小树形图(三级结构转二级结构) 逆遍历

    压缩路径树的线索化

    压缩存储

    查找线性直接 折半 Fab

    树形二叉查找树 平衡二叉树B 树 B-树 线索二叉树索引表

    排序插入排序直接排序、折半排序、2-路排序

    交换排序冒泡排序 快速排序 归并排序

    堆排序

    基数排序链式基数排序 桶排序

    代码素养代码的编写速度和准确性 误码率

    算法实现

    算法优化

    调试 查错 测试

    习惯变量名 注释 缩进 模块化

    基本算法数学高精度计算(模拟计算)

    表达式处理括号 前/中/后缀表达式 表达式树

    排列组合求值 嵌套控制

    高斯消元法

    筛选素数素数表

    分数处理

    基本操作实现大量数据赋值与移动Fillchar fillword move等函数

    处理实数比较大小 高精度

    字符串处理基本函数 KMP算法

    图论

    (显示图搜索)路径问题

    (边集)连通性测试传递闭包算法 极大强连通子图 最小点基

    最短路问题标号法 第k小路 减半最短路Dijkstra算法 floyd算法 bellman-ford算法 Warshall算法

    特殊路径欧拉路及回路 哈密尔顿路及回路

    图的中心和重心

    生成树Kruskal算法 Prim算法

    (顶点集)覆盖集

    独立集

    支配集

    割顶和块

    网络流容量有上下界的网络最大 / 小流

    容量有上下界的网络最小费用最大 / 小流

    顶容量网络最大流

    供求约束可行流

    二分图匹配匈牙利算法

    关键路径

    搜索

    (隐式图搜索)深度优先搜索

    (回溯法)剪枝优化

    预处理

    记忆化搜索

    可变下界的深度优先搜索

    随机化搜索

    广度优先搜索双向广搜 *多向广搜

    启发式搜索(A算法)

    分枝定界

    多阶段决策贪心算法

    动态规划

    其他构造法穷举

    模拟


    1.编程风格
    • 函数先声明再编写
    •  什么意思呢?
    • 就是说先在main()前以typename funname(argulist);的形式声明函数,然后再在main()后写代码。
    • 这样做的好处是,不用担心在fun1()中调用fun2()时fun2()还未定义以至于CE。 实例:qyz某次写了两个函数find1()和find2(),在find1()中调用了find2(),又在find2()中调用了find1(),这时如果直接在main前编写而不先声明的话,无论以怎样的顺序放两个函数的代码都是会CE的,这时就必须要先声明再编写了。 事实上,用术语应该叫做先定义,再实现。
    2.编程命令
    • 编译命令是个很好的东西,可以在很大程度上帮助你修正程序的语法错误。
    • ①-Wall -Wextra,这两个命令可以使编译器显示更多的警告,例如变量未初始化就使用, 有命名冲突,main未return 0;等等。
    • 还可以加上-Werror以使警告转换成错误。
    • ②跑暴力打表程序可以开-O2。-O2使得编译器对于程序进行优化,降低常数,提高速度。 注意,如果想卡时可不要开-O2,有很大影响的。另外,-O2会影响浮点数的精度,以及可能带来一些无法预料的问题。  //自注:o2比赛应该是不许用的……
    设置方法如下:
    如何加编译命令? 在左下图中勾选选项,并依次填写即可。注意加空格。或是直接在右图所示位置选择即可。

     
     
    ↑原文在这……还是自己看8QAQ
     

    3.自学
    学习信息学竞赛,自学是很重要的。 DP、Prim、Kruskal、dij、spfa、dinic、堆、C++的STL……这些东西徐老师都还没讲,而我都已经自学完了,这或许是我取得了一等的一个很重要的原因。 OI不像其他竞赛,很多时候仅靠上课的学习是远远不够的,这就需要有很好的自学能力了。 另外,做到随时随地学习也是很重要的。比如在手机中存上算法的资料,闲暇时打开来看。又比如安卓机可以装上c4droid和gcc for c4droid,随时可以编程。
    满堂花醉三千客,一剑霜寒十四州
  • 相关阅读:
    表的简单增删改查
    数据库基础入门语句
    exports与module.exports的区别
    Spring入门——简介
    Mybatis之动态SQL揭秘
    Mybatis的核心组成部分-SQL映射文件揭秘
    Mybatis框架简介、搭建及核心元素揭秘
    实战讲解:SSM+Maven开发APP信息管理平台-developer版
    OpenCV结构简介
    在Linux服务器上安装lxml
  • 原文地址:https://www.cnblogs.com/phemiku/p/11410347.html
Copyright © 2020-2023  润新知