程序设计竞赛有着各种各样的形式,在此,我们来介绍其中最负盛名的几个。* r5 f+ V& ]( J- Y( f
: _. w+ y# D w9 T4 ]
世界规模的大赛——Google Code Jam(GCJ)! d* m9 H1 I# l% s4 }! n
& t1 G- g7 N3 X它是Google公司几乎每年都会举办的世界规模的程序设计竞赛,参赛者要在2~3小时内解决大约4道题。一旦从在线(Online)进行的几轮预选中胜出,就能够参加现场(Onsite)总决赛。该赛事的特点是,每道题都备有Small和Large两组输入数据。即便是难度系数较大的问题,只要输入规模足够小,依然可以简单地求解,这一形式深受广大参赛者的喜欢。另外,GCJ并不在服务器上自动执行程序,而是要求将源代码和本地执行的结果一同提交。. o" ~6 q& I q, I4 X* k' Z
4 Y$ [$ @ y$ f1 [, V
向高排名看齐!——TopCoder D& ]# o- N* |$ ^1 u1 Y $ P$ R, r9 E" F: A* i% CTopCoder公司是一家策划并举办程序设计竞赛的公司,它举办的比赛涉及多个领域。其中之一就是算法(Algorithm)比赛,该赛事大致每周都以SRM(Single Round Match)的形式举办一场,其具有以下特点。 1 Q$ G7 v7 i: T1 D! e; ~& e 8 D# S0 Z6 }. k6 W2 x# s(1) 在1小时15分钟的短时间内挑战3道题。 ! h3 Q$ o# M% A' ?, v1 R$ [ q: w* b+ Q6 ^3 n
(2) 提交的结果在比赛结束前是不知道的,整个过程中稍有失误,就会变成0分。 M W! r, r! _; Y5 [, D9 Y O9 B& G
(3) 在编码阶段(coding phase)结束后,还有一个挑战阶段(challege phase)。该阶段可以查找别人代码中的漏洞。如果能够提供一组输入数据,使别人的程序返回错误的结果,就能得到额外的分数。$ k) N3 n) P" Q/ ^
! V2 l0 I9 Y3 v) h9 ] e x: c
其中第3条是该赛事独一无二的特点 ,也是阅读别人代码的好机会。TopCoder还有一个深受大家喜欢的等级分系统(rating system),它会依据SRM的结果给参赛选手排名。另外,TopCoder还会举办一年一度的TCO(TopCoder Open)公开赛。一旦从在线进行的几轮预选中胜出,就能够参加在拉斯维加斯 举办的总决赛。5 T1 K5 R- e* \+ J$ d- o
/ l: S1 p0 m& d0 Q2 U6 }# @
历史最悠久的竞赛——ACM-ICPC : f) p" z3 f$ ~+ i0 k. ~( E; e+ n0 V) y; @3 A
ACM-ICPC是由美国计算机协会(ACM)主办的、面向大学生的竞赛,也是历史最悠久的程序设计竞赛。这是一个三人一队的团队比赛,选手要在5个小时内解决大约10道题。因为比赛中三名选手共用一台电脑,题量又比其他赛事多,并且多是一些实现复杂的问题,所以团队配合显得异常重要。想要从日本参加该项赛事,首先要参加在线进行的国内预选赛,胜出后才能参加亚洲区域赛,取得前几名的好成绩后才能够参加世界总决赛。' A9 H- B7 s! b+ h4 K' z; o5 E
& L# P' e. U# j( P' N) T2 R' `+ \, L讲到ACM-ICPC,不得不提到我们的《挑战程序设计竞赛》(第2版)译者,这颗闪耀在编程竞赛中的明星巫泽俊,就在2011年的5月30下午2时,他获得了第35届ACM国际大学生程序设计竞赛全球总决赛冠军,媒体称他为“世界最聪明的人”。(见下图) # K5 W' \. h+ e D5 P) f5 P5 L4 |4 O. g! [; \' C" S' J* q) u8 W ! U! z. V3 I1 E- N 9 ^# }# v8 }' a h: i5 Z! o, [5 |2 X; j2 }9 D1 _. H
/ z2 N( r3 C G
巫泽俊平时训练的实验室' h' z# e* |) w7 x0 O
+ q- t/ K$ W6 M/ H4 n7 B$ ?% K( c* H
7 P Q) J& z7 }3 ~$ s" t7 F q
巫泽俊 5 G; G1 W" [2 h0 }4 X$ V4 M P* @4 |' O9 [) ]2 V! n7 ]
面向中学生的信息学奥林匹克竞赛——JOI-IOI2 U: C' F' d0 N$ r9 X8 _7 F
, l3 w. @" @" K$ E% Z6 k
信息学奥林匹克竞赛是学科奥林匹克竞赛的一种,是以初中生和高中生为参赛对象的程序设计竞赛。在日本,首先要参加日本信息学奥林匹克竞赛,取得优异成绩后,才能作为日本国家队选手参加国际信息学奥林匹克竞赛。 其他比赛都需要尽可能快地解决尽可能多的问题,而信息学奥林匹克竞赛只要在规定时间内求解问题即可,成绩与所用时间无关,但是它相对其他比赛而言,求解每道题所花的时间要长得多。虽然是面向中学生的比赛,每年所出问题的难度却是非常高的。" ]6 T4 M8 S6 H" r8 Z
$ {! j& _/ P. I, |7 z! t通过网络自动评测——Online Judge(OJ)1 |/ v" E! g2 N+ f% i8 Z8 q% n
" [; b3 A I" s" I在互联网上,有一些被称为Online Judge的系统,它们能够自动评测以往程序设计竞赛中的题目。利用该系统就可以练习了。另外,其中一些Online Judge也会定期举办自己的比赛,不妨去参加一下。在此列举几个有名的Online Judge。 2 m/ Q' N, S+ K4 a" M5 H2 {' v- O9 Y( U3 r9 I1 K
PKU Online Judge (POJ)—— 题库中有大量的题目。 : j" I r# V/ K: u& \) d会津大学Online Judge(AOJ)—— 还包含日语题。* t# C, Q1 I" _! \
Sphere Online Judge(SPOJ)—— 允许使用各种各样的编程语言。0 y6 _+ G1 m4 p0 ?0 C+ l) n$ x
SGU Online Contester—— 具有模拟参加历史比赛的虚拟赛功能。' \( g1 l' E2 X4 L) R
UVa Online Judge—— 老字号Online Judge,经常举办比赛。 * Y5 b( r0 q3 R" wCodecorces—— 与TopCoder一样定期举办比赛,又同其他网站一样不断维护历届题库。/ m. m7 T. o P/ m" u
关于本书0 I n1 N" A n' H3 y+ l' {' F
2 J r, \8 `4 p+ X$ J1 Z) o; o3 P- p9 w8 \/ I
$ g; k, c( _1 J7 G" p3 R! _
《挑战程序设计竞赛(第2版)》分为准备篇、初级篇、中级篇与高级篇4章。作者结合自己丰富的参赛经验,对严格筛选的110 多道各类试题进行了由易及难的细致讲解,每章后附有习题。 通过本书不仅可以学到算法,更能学到其设计和运用的思想。; s' L( x( [5 R# b+ N8 r6 A
9 M# \% a" j0 ~$ R6 V
只要是具有编程基础知识的读者,均适合阅读本书。书中的源代码均用C++实现,不过只用到了其基本功能,所以即便读者不熟悉C++也不影响阅读。3 ^8 \$ ]$ v. N
* K6 Y9 w4 Q: g- ?7 c" u% ]
本书的第一版被台湾和韩国引进,获得了一致的好评,让我们看看其他两版的封面风格:) 8 o$ e# a X2 G( I1 K5 n 1 J4 e8 `9 w. o5 {/ ^8 ]3 m * }' i. t. B/ \# @* }0 X+ M( ] 5 |. a3 U0 S# N `