计算机学习心得

我个人的这种自以为c语言很牛逼的美梦在,大一下学期的一次偶然比赛后完全破灭。(?_?#)(记得那会儿大一除了c语言其他都是基础课(比如:工程制图,高数,英语等),和计算机基本没一点关系。)

还记得,正在我沉醉自己的小天地时,那个大一下学期开学,一个同学喊我去参加一个校内编程比赛。当时满怀着胜利信心去参加了比赛。 结果。。。。大家都猜到了,初赛做了一到巨简单题目,然后。。。。复赛。。。一道题没做出来。更惨的说应该是:一道题都不会做,最后自己无聊的看着对面的一个mm敲码。。。再后来才知道是我们学校acm基地,准备纳新举行的一个比赛。并且由于急需纳新,那次题目出的是巨简单。

悲催的我比完赛后,失败了!!却还不知道为什么??!。。。

后来我郁闷一个星期后,在同学中介绍中,进入了当时认为”高手如云”的acm基地。

附:当时自己的水平:计算机只懂c语言,c语言只会些一些打印,简单几乎无循环的,无指针的,100行左右代码。编译基本自己搞定。逻辑错误?基本没什么逻辑的程

随后acm学习,就简单说说。记得当大家还都在迷茫中,或忙于考软件资格证,计算机二级证,或忙于网络游戏,或忙于学习其他专业的知识的时候。自己不顾外面的一切,每天和其他认真上自习室的同学一样,早起晚归得沉醉在acm中。

在acm基地,开始学习并巩固了,计算机数据结构,计算机算法,组合数学等知识,并不停的写码!在基地我一直这样坚持了两年多吧(知道二流学校的acm的艰苦的同学可能体会到,这其中的不易),到最后整个基地的同学仍坚持学习在前线的就只有我一人。于是也很自然的,我在学校acm系统中,排在了第一。虽然如此,但是越学我也越清楚这个算法的水有多深,也逐渐意识到外面高手真的如云,而且他们的高度,并不是自己所能赶上的。也意识到了,在算法前进的路上我的最大的阻碍是:数学!!!而更悲剧的是,就我自己的自学能力,再加上学校数学老师不怎么给力。。很难在段时间内弥补自己的这方面的缺陷。

所以大三下学期,我退出了acm,进入了实验室,做java的小项目。

在这两三年里,除了acm还有一些是计算机基础知识让我对计算机认识更深。

汇编语言让我明白了,计算机的计算机制,学完汇编,于是当我不确定c中某种结果时:我知道将c语言编成汇编语言,然后对比差别。通过反汇编理解指针,数组等类似问题差异和区别。

计算机组成原理,操作系统,不仅认识到为什么乘法会比加法费时的原因,内存存取方式,调度,分页等等。同时也就明白如何在c语言上进行这些细微底层的调优。

软件工程,则告诉我如何去大规模的程序开发的基本设计思想。自己并运用到一些课程设计中去。

于此同时平时也更多的关注了,网上出现的各种c语言本身讨论的一些问题。这其中有,c混乱代码,类似这种他编译器中的float的一个问题,c绘图,了解关注类似于结构体最后定义一个char[1]的这种奇技淫巧。于是针对c语言本身的书籍和资料,比如:?c专家编程?、?c缺陷与陷阱?。

附:个人此时水平:语言基本只会c语言和汇编语言;c语言100、200行的代码写完后基

本没有编译错误,最长c代码4000多行。c语言指针操纵多级的内存动态申请维护;内存泄漏,程序崩溃自己可以独立较快解决。

汇编语言,分文件设计,3000行,自己完成所有编写,和调试。(目前基本没用,很多忘了,呵呵~)

小界面,windows编程基本不懂。所以被当时同学鄙视了:你有什么牛的?也就时一些,黑屏的数字。。

到了这个时候,可以说目前(也就是工作两年后)我找到的这份工作很大一部分还要归功与acm!因为在第一份工作,我基本没有用到任何可以算上算法的算法,和算上数据结构的数据结构。(小道消息:这个工作的社招比例:1:20),好了。后面可能还会提到acm。 话说后来我离开了acm,进入实验室,于是我花了整整一个暑假,加上一个月左右的时间,学习了:java,jsp,javascript,包括ssh架构一些。

这其中比较艰难的是思想转变:1、由面向过程转变为面向对象(刚开始用java写的代码也是面向过程的。。。。),2、由传统的这种小计算应用转变为这种bs模型。这两个思想的提升使我对今后编写应用软件打下了很好的基础。

不管怎么样,自己很快就能熟练写java应用,后来由于就像其他习惯c的人都非常不喜欢java的这种”拿来主义”的做法一样,我后来一直在尽量不做java方面的开发,当然也就不会再进一步深入学习java方面的知识。(当然,目前来看,java还是一门开发应用软件的很给力的一门语言,细的我就不再多说,只是自己当初不喜欢)^o^()

随后大学里面还有一门重要的课程:计算机网络。(不过大学网络很基础,后来又简单自学了一些tcp\ip的那三本书。)

计算机网络告诉了我计算机互相通信的原理,了解计算机底层通信的方式。后来在工作中碰到的一些简单问题也就能解决。比如:

如何窃听网络数据的原理,arp欺骗,java这种bs模型能否获取客户端的mac地址(哈哈,自己后来工作中写脚本自动签到中考虑这个问题),类似这种接口调试中技巧,webservice的原理以及协议,大小端问题也算)^o^(。

还有一个是编译原理,让我明白作为c语言这种语言的编译过程,理解了编译的几个阶段。同时明白,sizeof的值再也不用记了,因为自己就可以分析出来,而且很简单,而且理解了各种错误处于哪个时期等都有利于自己对问题的分析。

哈哈,c语言中的scanf,printf高级应用,longjmp等在这后来时间也自己再进一步学习。

于此同时,自己自学了vb,学会了用vc++写动态库,所以后来一些桌面小应用,都用vb+dll来做的。所以课程设计什么的,都是小意思了。

再后来毕业设设计:用matlab+vb+dll写的,实际写码调试时间不超过两个星期(约12天),代码量近6000行。毕业设计拿了年级第一。

另外爆料一下:宿舍一哥们,一个算法毕设题目,我帮他搞定,总共花了一天;另外一哥们,用我的以前的课程设计搞过。。。

附:自己此时的水平:语言就不说了,此时算的上说的出口的还是c语言,其他则是我的工具而已,而且很多我现在依然忘了,(检起来也简单,呵呵~)

代码编译,调试几乎不是问题。但是此时对系统设计,软件工程认识还是基本没有,对设计模式更不了解,对社会上使用的技术也是,什么不懂。

@@@第一份工作

第一份工作,我没怎么去找,(~_~;)后来去了当时实习的公司。公司主要用的架构是:oracle+tuxedo+jsp。

当然用的也是unix主机。也就是说,我毕业后没有做类似嵌入式,windows编成的工作。后期的应用也都是,unix下的环境编成。

ok,这会儿开始了工作期间了。

在刚开始实习的时候,自己被安排做一些琐碎整理的事情,比如:将一个代码改为另外一个格式?

后来,实习了两个月,我打算离职。后来主管找我谈话,我告诉了自己的想法。后来答应我调到北京总部的一个研发部(一般至少工作一年,并表现很出色才允许调)。另外这儿不得不简单提一下为什么。。。

当时公司业务逻辑层主要用的是c语言,于我同批进去的实习生,后来很多人都问我c方面的问题。这个被技术主管看到,所以。。。他那次同意了我的要求。

话说调去了北京总部,就是常年的出差开始了,大约三个月后,参加了一个很大的项目,(200多号人一年多。)刚开始我只是负责一个简单的数据接口后台进程的需求调研和开发,当时自己刚入社会,做起事来相对有些不好意思。在加上,我这个正好是一个接口需求,需要和不同的人沟通。所以问题出现了,其它同事看我是个新人,也不怎么理我,常常找理由推托。最后这个小需求做的让我很恼火,自己也没太好办法。

再后来,这个需求完后,自己负责另外较为重要的数据接口。在后来近半年后,自己学习很快,很快掌握了,一些unix下的编成,以及调试技术。期间,有一个数据接口同事,和领导吵架跑回去了,领导后来让我接手,并开出了一些优惠条件^_^。自己当然接下也费了一些工作,而以前的工作则交给了另外一有工作经验的同事负责。后来我每个月都回家一趟休假,都被允许了。。有时很多人老员工也没被同意哦。

这之后,自己的能力慢慢得到认识,以前不理我的同事小组长,也都开始主动打招呼^_^。在之后,慢慢的有些同事问我一些技术上的问题。后来被部分同事称为”知识库”。

再后来,就不多说了,也就是毕业两年后,各种原因,离开原来公司。换了一份现在的工作。

附:技术能力,这期间c语言从自己小程序变成一个实实在在的应用的代码的转变,期间包括,多进程,网络编程,oracle一些知识包括:索引优化,sql等分析;设计模式,等但是期间更多的是提升自我团队协作,沟通,时间管理,设计分析等软素质吧。

目前还在学习中。。。互联网的知识。。。自己还有很多要学的。呵呵。 不过,学习是一件快乐的事情不是吗?

最后对还纠结在c语言的同学一点小建议吧:

1、c语言知识一门语言,就像java,peil等语言一样,仅仅是工具,因此不要把c语言看成很难,勤动手,多思考。语言终究是为了方便人,而设计的,所以他不难。

2、不要仅仅只看c语言,要从c语言看到计算机学科所有的知识点,并用c语言去巩固它们。为什么是c语言?他的确很合适,进入计算机有全面理解的一个入口。并以计算机的的角度去思考一些问题。

3、算法,数据结构,在现实中即使没用上,也会有助于你理解一些系统设计。

4、软件工程,系统设计也是很重要的哦。^_^,

5、知识永远是学不完的,计算机亦如此,而且越学越菜。^_^

6、以上建议仅供参考。

和楼主蛮像的,大一时在写个二三百行的五子棋就以为自己牛得不行了。 然后大二学了C++与STL之后,一直为自己C++学得很好,而且比别人多学了STL而沾沾自喜。 然后,直到后来到大二下学期接触了ACM之后才发现自己就是一弱菜~~ 与楼主不同的是,我们学校之前没有人搞ACM(省赛时都是临时组队过...

我是一名大三的学生,软件工程专业,从大学开始就开始了ACM的旅程,从大一到现在,基本上都是学的数论,几何等等方面的,几何也就一般般,三维几何都不是很会,对于数论,是我最擅长的吧,像连分数,二次剩余,原根,离散对数,牛顿二项式定理,费马平方和定理求表为平方和的解,对于数学方面的虽然我感觉还有很多我不会的,但是我感觉在ACM上面已经差不多了,至于其他方面的我多少也会点,至少很基础的都会吧,现在我想重点学习搜索,图论,DP,字符串,还有很多内容。在今年刚刚结束的亚洲区域赛杭州站获得铜牌,以前的省赛,东北赛等等也获得较好的名次。我毕业后想直接找工作,所以现在我想一边学习算法,继续做题,明年继续参加竞赛,一边想搞搞工程,我个人比较喜欢Linux嵌入式的方面的,又喜欢Java 和Lucene搜索引擎方面的。我是想问,这两方面哪一个比较好,比较有前景,然后对于算法方面的,哪些是以后工作后对应职业用的比较多的,比如我觉得数论在密码学方面用的比较多。对于ACM,我暂时是不想放弃。求各位学长们,或者已经工作的大神们给我建建议啊。

ACM程序题对锻炼逻辑思维是有很大帮助的,既然你明年还想参加比赛就不能放弃OJ,相信你们学校大三的学生也会带大一大二的学弟学妹吧,你可以不学习新的算法而去整理自己以前所学的,像DP、DFS什么的整理好,给他们讲,可能还会有新的收获。ACM很有魔力,相信你心里也是放不下。

ACM不是一份工作,你也不可能拿这个当自己一辈子吃饭的武器,当然除非你以后当老师什么的,专门讲一门课程。

Java从事的方面非常多,现在各行各业都需要Java程序员,真正工作了,你会发现ACM里面的算法用的微乎其微,大部分算法已经被封装好了,根本不需要你费劲脑汁去敲代码,你需要的是知道有这个东西,以及怎么去用,这个就需要你话费很长一段时间。很多东西你需要去学和复习巩固,从基础的css,sql, js, JQuery,ssh??差不多得花费1年多的时间,如果不报培训班自己去学的话,需要你自己制定好一个规划,下载教学视频,一步步来,多实践。

Linux嵌入式工资比Java的高,但是好工作也相对难找,我仅仅知道这些,上我去年找工作的时候听同学说的,对于这方面我不懂,也就不瞎说了自己不知道的了。

ACM应该是一个跳板,帮助你进一些名企,至于到底干什么,从事什么方面,很可能不会像你现在想的这么简单。大公司、名企对毕业生不会要求技术多好,随着时间累计技术都会提上去的,他们更看好你的潜力和以后对公司的价值。

最后说一句,IT程序员很辛苦,你要做好准备!加油吧!

算法,数据结构是关键,另外还有组合数学,特别是集合与图论,概率论也重要。推荐买一本《算法导论》,那本书行,看起来超爽!!!基本掌握语法还不行啊,语法的超熟练掌握,不然出了错误很难调试的!!!最重要的是超牛皮的头脑啦,分析能力,逻辑推理能力很重要。ACM很好玩啦,祝你成功!!!

acm是3人一组的,以学校为单位报名的,也就是说要得到学校同意,还要有2个一起搞的。其实可能是你不知道你们学校搞acm的地方,建议你好好询问下你们学校管科技创新方面的人。建议你找几个兴趣相同的一起做,互相探讨效果好多了,团队合作也是acm要求的3大能力之一。

数据结构远远不够的,建议你看算法导论,黑书,oj的话个人觉得还是poj好,有水题有好题,而且做的人多,要解题报告什么的也好找。我们就是一些做acm的学生一起搞,也没老师,这样肯定能行的。

基础的话是语言,然后数据结构,然后算法。

ACM有三个方向:算法,数学,实现

要求三种能力:英文,自学,团队协作

简单的说,你要能读懂英文的题意描述,要有一门acm能使用的编程语言,要会数据结构,有一点数学基础,一点编程方面天赋,要有兴趣和毅力(最重要),就具有做ACM的基本条件了。

做acm我推荐c,c++也可以,java在某些情况下好用,但是大多数情况的效率和代码量都不大好,所以建议主用c++,有些题目用java

还有什么问题,可以问我啊。

不好意思,没见过用java描述的acm书籍,大多数是用伪命令,其他有的用的c,c++,老一些的用pascal。java只是用来做高精度的一些题的,个人觉得不用专门看这方面的书,java的基本部分学好就够用了。所以我还是推荐主用c++,在高精度和个别题再用java。你可以找找java描述的算法设计与分析,这个好像有

数据结构:C语言版 清华大学出版社 严蔚敏 《数据结构》

算法:清华大学出版社 王晓东 《算法设计与分析》

麻省理工大学 中译本:机械工业出版社 《算法导论》

基本上这三本书就已经足够了,建议一般水平的人先不要看算法导论,待另外两本书看的差不多的时候,再看算法导论加深理解。

另外还有很多针对性更强的书籍,不过针对性太强,这里就不多介绍了。

以上一些都是些算法方面的书,最好的方式就是做题与看书相结合,很多在线做题的网站,PKU,ZOJ很多,推荐PKU,题目比较多,参与的人比较多。做一段时间的题,然后看书,研究算法,再做题,这样进步比较快。

还有关于ACM竞赛,我有自己的一点话说。

首先说下ACM/ICPC是个团队项目,最后的参赛名额是按照学校为单位的,所以找到志同道合的队友和学校的支持是很重要的。

刚刚接触信息学领域的同学往往存在很多困惑,不知道从何入手学习,在这篇文章里,我希望能将自己不多的经验与大家分享,希望对各位有所帮助。

一、语言是最重要的基本功

无论侧重于什么方面,只要是通过计算机程序去最终实现的竞赛,语言都是大家要过的第一道关。亚洲赛区的比赛支持的语言包括C/C++与JAVA。笔者首先说说JAVA,众所周知,作为面向对象的王牌语言,JAVA在大型工程的组织与安全性方面有着自己独特的优势,但是对于信息学比赛的具体场合,JAVA则显得不那么合适,它对于输入输出流的操作相比于C++要繁杂很多,更为重要的是JAVA程序的运行速度要比C++慢10倍以上,而竞赛中对于JAVA程序的运行时限却往往得不到同等比例的放宽,这无疑对算法设计提出了更高的要求,是相当不利的。其实,笔者并不主张大家在这种场合过多地运用面向对象的程序设计思维,因为对于小程序来说这不旦需要花费更多的时间去编写代码,也会降低程序的执行效率。

接着说C和C++。许多现在参加讲座的同学还在上大一,C的基础知识刚刚学完,还没有接触过C++,其实在赛场上使用纯C的选手还是大有人在的,它们主要是看重了纯C在效率上的优势,所以这部分同学如果时间有限,并不需要急着去学习新的语言,只要提高了自己在算法设计上的造诣,纯C一样能发挥巨大的威力。

而C++相对于C,在输入输出流上的封装大大方便了我们的操作,同时降低了出错的可能性,并且能够很好地实现标准流与文件流的切换,方便了调试的工作。如果有些同学比较在意这点,可以尝试C和C++的混编,毕竟仅仅学习C++的流操作还是不花什么时间的。

C++的另一个支持来源于标准模版库(STL),库中提供的对于基本数据结构的统一接口操作和基本算法的实现可以缩减我们编写代码的长度,这可以节省一些时间。但是,与此相对的,使用STL要在效率上做出一些牺牲,对于输入规模很大的题目,有时候必须放弃STL,这意味着我们不能存在“有了STL就可以不去管基本算法的实现”的想法;另外,熟练和恰当地使用STL必须经过一定时间的积累,准确地了解各种操作的时间复杂度,切忌对STL中不熟悉的部分滥用,因为这其中蕴涵着许多初学者不易发现的陷阱。

通过以上的分析,我们可以看出仅就信息学竞赛而言,对语言的掌握并不要求十分全面,但是对于经常用到的部分,必须十分熟练,不允许有半点不清楚的地方,下面我举个真实的例子来说明这个道理——即使是一点很细微的语言障碍,都有可能酿成错误:

在去年清华的赛区上,有一个队在做F题的时候使用了cout和printf的混合输出,由于一个带缓冲一个不带,所以输出一长就混乱了。只是因为当时judge team中负责F题的人眼睛尖,看出答案没错只是顺序不对(答案有一页多,是所有题目中最长的一个输出),

又看了看程序发现只是输出问题就给了个Presentation error(格式错)。如果审题的人不是这样而是直接给一个 Wrong Answer,相信这个队是很难查到自己错在什么地方的。

现在我们转入第二个方面的讨论,基础学科知识的积累。

二、以数学为主的基础知识十分重要

虽然被定性为程序设计竞赛,但是参赛选手所遇到的问题更多的是没有解决问题的思路,而不是有了思路却死活不能实现,这就是平时积累的基础知识不够。今年World Final的总冠军是波兰华沙大学,其成员出自于数学系而非计算机系,这就是一个鲜活的例子。竞赛中对于基础学科的涉及主要集中于数学,此外对于物理、电路等等也可能有一定应用,但是不多。因此,大一的同学也不必为自己还没学数据结构而感到不知从何入手提高,把数学捡起来吧!下面我来谈谈在竞赛中应用的数学的主要分支。

1、离散数学——作为计算机学科的基础,离散数学是竞赛中涉及最多的数学分支,其重中之重又在于图论和组合数学,尤其是图论。

图论之所以运用最多是因为它的变化最多,而且可以轻易地结合基本数据结构和许多算法的基本思想,较多用到的知识包括连通性判断、DFS和BFS,关节点和关键路径、欧拉回路、最小生成树、最短路径、二部图匹配和网络流等等。虽然这部分的比重很大,但是往往也是竞赛中的难题所在,如果有初学者对于这部分的某些具体内容暂时感到力不从心,也不必着急,可以慢慢积累。

竞赛中设计的组合计数问题大都需要用组合数学来解决,组合数学中的知识相比于图论要简单一些,很多知识对于小学上过奥校的同学来说已经十分熟悉,但是也有一些部分需要先对代数结构中的群论有初步了解才能进行学习。组合数学在竞赛中很少以难题的形式出现,但是如果积累不够,任何一道这方面的题目却都有可能成为难题。

2、数论——以素数判断和同余为模型构造出来的题目往往需要较多的数论知识来解决,这部分在竞赛中的比重并不大,但只要来上一道,也足以使知识不足的人冥思苦想上一阵时间。素数判断和同余最常见的是在以密码学为背景的题目中出现,在运用密码学常识确定大概的过程之后,核心算法往往要涉及数论的内容。

3、计算几何——计算几何相比于其它部分来说是比较独立的,就是说它和其它的知识点很少有过多的结合,较常用到的部分包括——线段相交的判断、多边形面积的计算、内点外点的判断、凸包等等。计算几何的题目难度不会很大,但也永远不会成为最弱的题。

4、线性代数——对线性代数的应用都是围绕矩阵展开的,一些表面上是模拟的题目往往可以借助于矩阵来找到更好的算法。

5、概率论——竞赛是以黑箱来判卷的,这就是说你几乎不能动使用概率算法的念头,但这也并不是说概率就没有用。关于这一点,只有通过一定的练习才能体会。

6、初等数学与解析几何——这主要就是中学的知识了,用的不多,但是至少比高等数

学多,我觉得熟悉一下数学手册上的相关内容,至少要知道在哪儿能查到,还是必要的。 7、高等数学——纯粹运用高等数学来解决的题目我接触的只有一道,但是一些题目的叙述背景往往需要和这部分有一定联系,掌握得牢固一些总归没有坏处。

以上就是竞赛所涉及的数学领域,可以说范围是相当广的。我认识的许多人去搞信息学的竞赛就是为了逼着自己多学一点数学,因为数学是一切一切的基础。

三、数据结构与算法是真正的核心

虽然数学十分十分重要,但是如果让三个只会数学的人参加比赛,我相信多数情况下会比三个只会数据结构与算法的人得到更为悲惨的结局。

先说说数据结构。掌握队列、堆栈和图的基本表达与操作是必需的,至于树,我个人觉得需要建树的问题有但是并不多。(但是树往往是很重要的分析工具)除此之外,排序和查找并不需要对所有方式都能很熟练的掌握,但你必须保证自己对于各种情况都有一个在时间复杂度上满足最低要求的解决方案。说到时间复杂度,就又该说说哈希表了,竞赛时对时间的限制远远多于对空间的限制,这要求大家尽快掌握“以空间换时间”的原则策略,能用哈希表来存储的数据一定不要到时候再去查找,如果实在不能建哈希表,再看看能否建二叉查找树等等——这都是争取时间的策略,掌握这些技巧需要大家对数据结构尤其是算法复杂度有比较全面的理性和感性认识。

接着说说算法。算法中最基本和常用的是搜索,主要是回溯和分支限界法的使用。这里要说的是,有些初学者在学习这些搜索基本算法是不太注意剪枝,这是十分不可取的,因为所有搜索的题目给你的测试用例都不会有很大的规模,你往往察觉不出程序运行的时间问题,但是真正的测试数据一定能过滤出那些没有剪枝的算法。实际上参赛选手基本上都会使用常用的搜索算法,题目的区分度往往就是建立在诸如剪枝之类的优化上了。

常用算法中的另一类是以“相似或相同子问题”为核心的,包括递推、递归、贪心法和动态规划。这其中比较难于掌握的就是动态规划,如何抽象出重复的子问题是很多题目的难点所在,笔者建议初学者仔细理解图论中一些以动态规划为基本思想所建立起来的基本算法(比如Floyd-Warshall算法),并且多阅读一些定理的证明,这虽然不能有什么直接的帮助,但是长期坚持就会对思维很有帮助。

四、团队配合

通过以上的介绍大家也可以看出,信息学竞赛对于知识面覆盖的非常广,想凭一己之力全部消化这些东西实在是相当困难的,这就要求我们尽可能地发挥团队协作的精神。同组成员之间的熟练配合和默契的形成需要时间,具体的情况因成员的组成不同而不同,这里我就不再多说了。

五、练习、练习、再练习

知识的积累固然重要,但是信息学终究不是看出来的,而是练出来的,这是多少前人最

深的一点体会,只有通过具体题目的分析和实践,才能真正掌握数学的使用和算法的应用,并在不断的练习中增加编程经验和技巧,提高对时间复杂度的感性认识,优化时间的分配,加强团队的配合。总之,在这里光有纸上谈兵是绝对不行的,必须要通过实战来锻炼自己。 大家一定要问,我们去哪里找题做,又如何检验程序是否正确呢?这大可不必担心,现在已经有了很多网上做题的站点,这些站点提供了大量的题库并支持在线判卷,你只需要把程序源码提交上去,马上就可以知道自己的程序是否正确,运行所使用的时间以及消耗的内存等等状况。下面我给大家推荐几个站点,笔者不建议大家在所有这些站点上做题,选择一个就可以了,因为每个站点的题都有一定的难易比例,系统地做一套题库可以使你对各种难度、各种类型的题都有所认识。

1、Ural:

Ural是中国学生对俄罗斯的Ural州立大学的简称 ,那里设立了一个Ural Online Problem Set,并且支持Online Judge。Ural的不少题目算法性和趣闻性都很强,得到了国内广大学生的厚爱。根据“信息学初学者之家”网站的统计,Ural的题目类型大概呈如下的分布:

题型

搜索

动态规划

贪心

构造

图论

计算几何

纯数学问题

数据结构

其它

所占比例

约10%

约15%

约5%

约5%

约10%

约5%

约20%

约5%

约25%

这和实际比赛中的题型分布也是大体相当的。有兴趣的朋友可以去看看。

2、UVA:

UVA代表西班牙Valladolid大学(University de Valladolid)。该大学有一个那里设立了一个PROBLEM SET ARCHIVE with ONLINE JUDGE ,并且支持ONLINE JUDGE,形式和Ural大学的题库类似。不过和Ural不同的是,UVA题目多的多,而且比较杂,而且有些题目的测试数据比较刁钻。这使得刚到那里做题的朋友往往感觉到无所适从,要么难以找到合适的题目,要么Wrong Answer了很多次以后仍然不知道错在那里。 如果说做Ural题目主要是为了训练算法,那么UVA题目可以训练全方位的基本功和一些必要的编程素质。UVA和许多世界知名大学联合办有同步网上比赛,因此那里强人无数,不过你先要使自己具有听懂他们在说什么的素质:)

3、ZOJ:

ZOJ是浙江大学建立的ONLINE JUDGE,是中国大学建立的第一个同类站点,也是最好和人气最高的一个,笔者和许多班里的同学就是在这里练习。ZOJ虽然也定位为一个英文网站,但是这里的中国学生比较多,因此让人觉得很亲切。这里目前有500多道题目,难易分配适中,且涵盖了各大洲的题目类型并配有索引,除此之外,ZOJ的JUDGE系统是几个网站中表现得比较好的一个,很少出现Wrong Answer和Presentation error混淆的情况。这里每月也办有一次网上比赛,只要是注册的用户都可以参加。

说起中国的ONLINE JUDGE,去年才开始参加ACM竞赛的北京大学现在也建立了自己的提交系统;而我们学校也是去年开始参加比赛,现在也有可能推出自己的提交系统,如果能够做成,到时候大家就可以去上面做题了。同类网站的飞速发展标志着有越来越多的同学有兴趣进入信息学的领域探索,这是一件好事,同时也意味着更激烈的竞争。

相关推荐