什么是UVa OJ?
UVa OJ(英文)是西班牙巴利亚多利德大学提供的一套在线评判系统(OJ)。它提供多达近3000道ACM算法题,而且还在增加。任何人在免费注册后都可以浏览题目和提交自己的解答程序。服务器会自动编译你提交的代码,用特殊的数据(不是题目中的Test Case)进行测试,并立即做出评判。如果程序在限定条件内运行出符合要求的结果,系统会给出运行时间和下列结果:
- 正确(Accepted, AC)
- 答案错误(Wrong Answer, WA)
- 用时超过限制(Time Limit Exceed, TLE)
- 输出超过限制(Output Limit Exceed, OLE)
- 内存超过限制(Memory Limit Exceed, MLE)
- 运行时错误(Runtime Error, RE),一般是数组越界访问引起的
- 输出格式错误(Presentation Error, PE)
- 编译出错(Compile Error, CE)
UVa OJ支持的编程语言包括C、C++、Pascal和Java。现在全球很多大学都提供OJ系统,中国也有不少,比如北大的PKU OJ,浙大的ZOJ,同济的TOJ等等。但综合比较起来,个人觉得还是UVa的系统更加完善,题目也更全面。
在OJ上做题需要什么基础?
OJ是为职业程序员准备的,对语言基本功要求较高。各类常用的数据结构和算法也要求有一定的使用经验。UVa OJ的题目难度差别悬殊,最大的麻烦就是所有题目并没有按难度排序,因此至少具备很快确定算法难度的能力,才能选择适合自己的题目。个人推荐使用C++做题,一是可以使用非常便利的STL,二是在网上有大量的相关资源,其它语言的解答比较少。
还有哪些需要注意的地方?
OJ的评判非常严格,做题时一定要仔细审题,重点看“Input”和“Output”段落的要求。虽然OJ会用特别的输入数据进行测试,但绝对不会超过题目中给定的限制。而题目中没有特别的说明的地方则是什么情况都可能出现,这一点要格外小心。输出时一个空格也不能多,如果要求的结果是用空格分隔的一行数字,那么在行尾多了一个空格就很可能得到WA或着PE。
如果你获得了一个题的Accepted,在浏览界面那道题目的底色就会变绿,当你的账号里满版飘绿时一定会非常有成就感。如果你被卡在一道题始终得不到AC,请按顺序尝试下面几个方法:
- 重新认真的读题,检查是否按题目的要求处理输入数据,是否按要求的格式输出,尤其注意末尾是否有多余的空格。
- 仔细检查你的代码是否处理了题目没有限定的“异常”输入数据,最好能自己模拟一些可能的异常数据来进行测试。
- 另写一段代码生成1000000组随机数据对你的算法进行测试,并用另外一段代码进行验证。
- 访问UVa OJ的论坛(英文)搜索类似问题,一般都可以找到更多的测试数据。也可以发贴寻求帮助。
- 在Google上搜索题目名称,一般都可以搜到能AC的代码。把它加到你的程序中,然后用大量数据测试你的代码和正确代码在运行结果上的异同。
- 考虑你是否使用了“非主流”的算法或思路。虽然OJ不会检查你的代码,但有时对某些异常情况的不同处理,会导致错误的结果。
- 如果以上方法都不能解决你的问题,欢迎给我发Email(地址见侧栏),我乐意和你一起研究这个难题!(我已经发布过的题目则请仔细阅读文章,谢谢!)
我的计划
其实我很早就做过OJ题目了,但非常惭愧的是我一直没有勇气和毅力坚持下来,希望从现在起开始补救还不算太晚。这一系列文章将记录我进步的历程,每篇的格式都固定,包括原题目及翻译、思路分析和我的解答代码。发布一篇题目需要花大量的时间,有些题目可能并不完善(比如还没有翻译),敬请见谅。我计划每完成50题就休息一段时间,把前面发的文章整理一遍,也算是给自己做一次复习。
我在写每篇文章时都会力求以最简明的方式把问题讲清楚,因此可能会比较罗嗦。代码的注释也会非常详细,让就算没有C++/STL语言基础的人也能一眼看懂。但我还是希望您先不要看分析和代码,自己做一下这些题目。直接把代码粘到UVa OJ上是没有任何意义的,事实上这一步我早就替您做过了。能看懂并不代表能写出来,手熟才是最重要,切莫眼高手低。只有当您实在没有思路或着一直卡到WA,分析和代码可以为您提供一些参考。