程序设计竞赛有着各种各样的形式,在此,我们来介绍其中最负盛名的几个。 | a- D0 A0 y1 T3 z5 H0 x ' t9 M& r2 z) g4 J* T世界规模的大赛——Google Code Jam(GCJ) 2 p6 V6 C5 {- \ 8 l& m0 b; H' X它是Google公司几乎每年都会举办的世界规模的程序设计竞赛,参赛者要在2~3小时内解决大约4道题。一旦从在线(Online)进行的几轮预选中胜出,就能够参加现场(Onsite)总决赛。该赛事的特点是,每道题都备有Small和Large两组输入数据。即便是难度系数较大的问题,只要输入规模足够小,依然可以简单地求解,这一形式深受广大参赛者的喜欢。另外,GCJ并不在服务器上自动执行程序,而是要求将源代码和本地执行的结果一同提交。6 m1 Z1 \4 Z- K' K! E8 ^
4 _8 B4 q# T- S% l
向高排名看齐!——TopCoder ' F# o$ Z9 t( }5 J2 E9 v - K* W0 H% C" }. F8 g7 O6 ETopCoder公司是一家策划并举办程序设计竞赛的公司,它举办的比赛涉及多个领域。其中之一就是算法(Algorithm)比赛,该赛事大致每周都以SRM(Single Round Match)的形式举办一场,其具有以下特点。3 U" J, c+ R; Z+ c3 Z0 W P
* n' k) {$ Z1 {9 s( d
(1) 在1小时15分钟的短时间内挑战3道题。 & j5 X# l% p* q" V3 Z& a' a' n; r! m4 Y3 g
(2) 提交的结果在比赛结束前是不知道的,整个过程中稍有失误,就会变成0分。 7 Z: w+ a( a: n' W+ [' j2 p6 c $ \" m: F* O6 ]+ G(3) 在编码阶段(coding phase)结束后,还有一个挑战阶段(challege phase)。该阶段可以查找别人代码中的漏洞。如果能够提供一组输入数据,使别人的程序返回错误的结果,就能得到额外的分数。* G7 T& i, M+ I; \
, Y5 G' `0 U0 n
其中第3条是该赛事独一无二的特点 ,也是阅读别人代码的好机会。TopCoder还有一个深受大家喜欢的等级分系统(rating system),它会依据SRM的结果给参赛选手排名。另外,TopCoder还会举办一年一度的TCO(TopCoder Open)公开赛。一旦从在线进行的几轮预选中胜出,就能够参加在拉斯维加斯 举办的总决赛。 2 G4 w' q' i' u _- C4 O5 y& K' S2 T& ^# c5 m) Y' h5 v% S* `
历史最悠久的竞赛——ACM-ICPC : p4 d9 {( g) V3 u1 j8 t0 r# @( W: \8 B5 I7 _. a+ d* Z4 q; G
ACM-ICPC是由美国计算机协会(ACM)主办的、面向大学生的竞赛,也是历史最悠久的程序设计竞赛。这是一个三人一队的团队比赛,选手要在5个小时内解决大约10道题。因为比赛中三名选手共用一台电脑,题量又比其他赛事多,并且多是一些实现复杂的问题,所以团队配合显得异常重要。想要从日本参加该项赛事,首先要参加在线进行的国内预选赛,胜出后才能参加亚洲区域赛,取得前几名的好成绩后才能够参加世界总决赛。 6 s' d& y0 G) C9 |' i) e7 X/ P4 n, R- c
讲到ACM-ICPC,不得不提到我们的《挑战程序设计竞赛》(第2版)译者,这颗闪耀在编程竞赛中的明星巫泽俊,就在2011年的5月30下午2时,他获得了第35届ACM国际大学生程序设计竞赛全球总决赛冠军,媒体称他为“世界最聪明的人”。(见下图)7 A" F; `; C3 t7 i1 d; q3 d
0 V! d& s' X3 j9 N 2 x: v1 j) o; u7 d7 | A , p" H1 w; M8 p7 r2 x+ u* u 9 `/ c" e, N* _ 4 z' f9 X% Q. z* q+ Q巫泽俊平时训练的实验室 ; B: I4 T# }1 @7 [; R/ W" W% N0 ~( j+ A" Q& F: V: ?- W , B" I' g$ _- c) e7 V' X$ I+ J" r& l8 i! s$ {/ b/ |* D4 J$ S
巫泽俊 6 t" I M6 R1 f$ C. f d2 ^0 Z
面向中学生的信息学奥林匹克竞赛——JOI-IOI 0 N: E5 Y0 l$ G a# I" L( V/ W: u% |3 J: `2 X信息学奥林匹克竞赛是学科奥林匹克竞赛的一种,是以初中生和高中生为参赛对象的程序设计竞赛。在日本,首先要参加日本信息学奥林匹克竞赛,取得优异成绩后,才能作为日本国家队选手参加国际信息学奥林匹克竞赛。 其他比赛都需要尽可能快地解决尽可能多的问题,而信息学奥林匹克竞赛只要在规定时间内求解问题即可,成绩与所用时间无关,但是它相对其他比赛而言,求解每道题所花的时间要长得多。虽然是面向中学生的比赛,每年所出问题的难度却是非常高的。3 A1 n+ U$ d; v! k6 }2 i- t3 ^
" i$ T2 h8 ^+ L+ S. e
通过网络自动评测——Online Judge(OJ) ' u5 H1 ]- d8 R " ~, n5 W% g) i) }7 H在互联网上,有一些被称为Online Judge的系统,它们能够自动评测以往程序设计竞赛中的题目。利用该系统就可以练习了。另外,其中一些Online Judge也会定期举办自己的比赛,不妨去参加一下。在此列举几个有名的Online Judge。 J& L5 K2 [. V. h! y( g
+ M% x- R3 v( | u" g
PKU Online Judge (POJ)—— 题库中有大量的题目。* c( H l; r K. y/ N
会津大学Online Judge(AOJ)—— 还包含日语题。) l7 Z- W# b p& Z" A4 b. |9 h
Sphere Online Judge(SPOJ)—— 允许使用各种各样的编程语言。 6 T3 e: Q: { USGU Online Contester—— 具有模拟参加历史比赛的虚拟赛功能。 4 ?; }5 x" a+ gUVa Online Judge—— 老字号Online Judge,经常举办比赛。3 f3 s$ B* O+ |' r. Q
Codecorces—— 与TopCoder一样定期举办比赛,又同其他网站一样不断维护历届题库。! p" }) K {4 V0 n
关于本书 . ~! u' b6 e8 z9 m( H- e# c% Q - v; n6 ^% `% G0 d) d( C, _7 C+ e) z3 B, J% \
5 v7 z, s X3 m" h# L/ p
《挑战程序设计竞赛(第2版)》分为准备篇、初级篇、中级篇与高级篇4章。作者结合自己丰富的参赛经验,对严格筛选的110 多道各类试题进行了由易及难的细致讲解,每章后附有习题。 通过本书不仅可以学到算法,更能学到其设计和运用的思想。# k. j2 }& |' w7 l
1 K& v, j. U0 J8 F/ K: p" f s. A只要是具有编程基础知识的读者,均适合阅读本书。书中的源代码均用C++实现,不过只用到了其基本功能,所以即便读者不熟悉C++也不影响阅读。% j! J' B3 G- R
4 s! Q" J7 x* b: p" X ~( K& x L本书的第一版被台湾和韩国引进,获得了一致的好评,让我们看看其他两版的封面风格:)6 ^5 Y5 a) m) c+ w2 b5 @) E
2 e z3 n, a( h$ E) D 7 ]* G8 p: _& I+ U3 E7 |
/ U; D# P |! T5 j