程序设计竞赛有着各种各样的形式,在此,我们来介绍其中最负盛名的几个。0 u7 N L, z# U! ~) f6 `
8 o0 g) U: z2 a2 k世界规模的大赛——Google Code Jam(GCJ)1 f7 I8 a" O i3 s0 W8 P" o
; c' K! l& M# z" F/ k它是Google公司几乎每年都会举办的世界规模的程序设计竞赛,参赛者要在2~3小时内解决大约4道题。一旦从在线(Online)进行的几轮预选中胜出,就能够参加现场(Onsite)总决赛。该赛事的特点是,每道题都备有Small和Large两组输入数据。即便是难度系数较大的问题,只要输入规模足够小,依然可以简单地求解,这一形式深受广大参赛者的喜欢。另外,GCJ并不在服务器上自动执行程序,而是要求将源代码和本地执行的结果一同提交。* v4 j! s* X k% ~1 K; q
7 |! j- E) e' @1 ~2 N! M, q2 k向高排名看齐!——TopCoder) {1 q8 [0 H1 P! R6 Z" r
) J3 d4 X6 d6 p( W% u, q! P
TopCoder公司是一家策划并举办程序设计竞赛的公司,它举办的比赛涉及多个领域。其中之一就是算法(Algorithm)比赛,该赛事大致每周都以SRM(Single Round Match)的形式举办一场,其具有以下特点。 7 R, H& ^: F! ~0 I3 s5 M: g+ h2 j8 g- ^7 a4 {7 d
(1) 在1小时15分钟的短时间内挑战3道题。 L# } m/ A/ w% z: M
7 H; V( S* G6 F% S+ f$ R* f/ v
(2) 提交的结果在比赛结束前是不知道的,整个过程中稍有失误,就会变成0分。 5 d1 _, a; H1 ]" f ! z2 _! h j& p; f1 t(3) 在编码阶段(coding phase)结束后,还有一个挑战阶段(challege phase)。该阶段可以查找别人代码中的漏洞。如果能够提供一组输入数据,使别人的程序返回错误的结果,就能得到额外的分数。2 w/ v% u0 h- [5 D, b% [
; }) A) W! R9 `9 C
其中第3条是该赛事独一无二的特点 ,也是阅读别人代码的好机会。TopCoder还有一个深受大家喜欢的等级分系统(rating system),它会依据SRM的结果给参赛选手排名。另外,TopCoder还会举办一年一度的TCO(TopCoder Open)公开赛。一旦从在线进行的几轮预选中胜出,就能够参加在拉斯维加斯 举办的总决赛。 $ k8 `, j9 t! R% c: Z# k/ ^ ; |9 s/ Y% V1 Q, f3 u$ E5 y5 A历史最悠久的竞赛——ACM-ICPC ( m9 A' S5 U& T 4 N: P/ }/ E$ i( c& O; D) ]ACM-ICPC是由美国计算机协会(ACM)主办的、面向大学生的竞赛,也是历史最悠久的程序设计竞赛。这是一个三人一队的团队比赛,选手要在5个小时内解决大约10道题。因为比赛中三名选手共用一台电脑,题量又比其他赛事多,并且多是一些实现复杂的问题,所以团队配合显得异常重要。想要从日本参加该项赛事,首先要参加在线进行的国内预选赛,胜出后才能参加亚洲区域赛,取得前几名的好成绩后才能够参加世界总决赛。, H$ Z2 U2 b; h# {3 \
" B/ P' _' K& J$ @* J
讲到ACM-ICPC,不得不提到我们的《挑战程序设计竞赛》(第2版)译者,这颗闪耀在编程竞赛中的明星巫泽俊,就在2011年的5月30下午2时,他获得了第35届ACM国际大学生程序设计竞赛全球总决赛冠军,媒体称他为“世界最聪明的人”。(见下图) 3 Y. j$ t! |% j$ D8 a8 m ~ ( }- I& m* Z: V4 D5 N ! v3 o/ c1 h4 C0 Z/ E: l6 ? 7 ~( Z# U% {# t+ q. I8 K$ a3 p9 U& \) I- m5 h
. J1 P' L. y" Q, \% H' D
巫泽俊平时训练的实验室: D1 h7 @0 ]) |3 w0 V
8 d; z: W- } a" w' `7 z 6 Y9 i. x- w: f: K( [
" ?4 j+ Q, j% S- z巫泽俊: p& \0 {) I; j. I5 X
/ T# r! z2 j2 ?$ `% G
面向中学生的信息学奥林匹克竞赛——JOI-IOI , S2 m) T$ e6 p, d' R) W7 Q C" F& ?2 w, u( `) }8 I; [3 P信息学奥林匹克竞赛是学科奥林匹克竞赛的一种,是以初中生和高中生为参赛对象的程序设计竞赛。在日本,首先要参加日本信息学奥林匹克竞赛,取得优异成绩后,才能作为日本国家队选手参加国际信息学奥林匹克竞赛。 其他比赛都需要尽可能快地解决尽可能多的问题,而信息学奥林匹克竞赛只要在规定时间内求解问题即可,成绩与所用时间无关,但是它相对其他比赛而言,求解每道题所花的时间要长得多。虽然是面向中学生的比赛,每年所出问题的难度却是非常高的。. H1 t' Q5 o. C9 g! G9 |8 n
1 V+ o& v/ V8 ^3 I6 l6 P
通过网络自动评测——Online Judge(OJ) % d. Y* V4 A) R D' g) I' h7 n: [' M! L) S& X
在互联网上,有一些被称为Online Judge的系统,它们能够自动评测以往程序设计竞赛中的题目。利用该系统就可以练习了。另外,其中一些Online Judge也会定期举办自己的比赛,不妨去参加一下。在此列举几个有名的Online Judge。 ( f: J0 R' N! ~7 \" K3 R4 \" z" t( j- k+ J+ ]7 y
PKU Online Judge (POJ)—— 题库中有大量的题目。 % E6 O" S2 b1 i% f7 v会津大学Online Judge(AOJ)—— 还包含日语题。8 y' d4 i; F4 K& e
Sphere Online Judge(SPOJ)—— 允许使用各种各样的编程语言。; ^& m% g' U2 y9 |! \
SGU Online Contester—— 具有模拟参加历史比赛的虚拟赛功能。6 `% A0 U' r9 m, x& p
UVa Online Judge—— 老字号Online Judge,经常举办比赛。 0 M( c8 v3 C* y2 v! w8 xCodecorces—— 与TopCoder一样定期举办比赛,又同其他网站一样不断维护历届题库。# ]! p! s+ p% ~/ ^1 {& K3 B, ^6 E
关于本书9 D6 t2 `& `4 o3 ]* w) W
4 n! Q4 F5 L; J4 X$ o2 @ 9 K" f* I0 R: _3 a' N. [1 Z6 e% M
: ]: `0 C6 l" d. F( g V3 t《挑战程序设计竞赛(第2版)》分为准备篇、初级篇、中级篇与高级篇4章。作者结合自己丰富的参赛经验,对严格筛选的110 多道各类试题进行了由易及难的细致讲解,每章后附有习题。 通过本书不仅可以学到算法,更能学到其设计和运用的思想。9 G5 E' [0 {( x, Y2 u