程序设计竞赛有着各种各样的形式,在此,我们来介绍其中最负盛名的几个。 3 t9 K3 u$ l' s6 C# ? 3 D$ f" E$ w* H5 v7 h世界规模的大赛——Google Code Jam(GCJ) 1 w" n' D/ _6 j2 |9 k1 V2 ~ . Z; {) P# T( L1 v9 T0 B它是Google公司几乎每年都会举办的世界规模的程序设计竞赛,参赛者要在2~3小时内解决大约4道题。一旦从在线(Online)进行的几轮预选中胜出,就能够参加现场(Onsite)总决赛。该赛事的特点是,每道题都备有Small和Large两组输入数据。即便是难度系数较大的问题,只要输入规模足够小,依然可以简单地求解,这一形式深受广大参赛者的喜欢。另外,GCJ并不在服务器上自动执行程序,而是要求将源代码和本地执行的结果一同提交。 ) E5 ~/ _. _9 p1 G! Q' R* L+ {, n: u1 L' ~* G9 w
向高排名看齐!——TopCoder ' m" N6 e! N9 ~8 ]! c1 m. @- J+ m+ D' P1 O/ Z- Z
TopCoder公司是一家策划并举办程序设计竞赛的公司,它举办的比赛涉及多个领域。其中之一就是算法(Algorithm)比赛,该赛事大致每周都以SRM(Single Round Match)的形式举办一场,其具有以下特点。 K0 L$ U- n2 N2 N" M5 c6 O. m1 n - l7 @) |4 {6 o2 c; [(1) 在1小时15分钟的短时间内挑战3道题。$ B* m1 U/ ?$ M; \0 }8 w
& x* c, m4 ~2 N4 O ^* E; ~+ L p
(2) 提交的结果在比赛结束前是不知道的,整个过程中稍有失误,就会变成0分。' b' U: @" s! P8 P% [/ x
7 _ R: o! X+ t/ X8 a
(3) 在编码阶段(coding phase)结束后,还有一个挑战阶段(challege phase)。该阶段可以查找别人代码中的漏洞。如果能够提供一组输入数据,使别人的程序返回错误的结果,就能得到额外的分数。 $ |) J/ o+ g1 H+ R; S1 u: Q " k& |# Q. J, H) A0 S& G b其中第3条是该赛事独一无二的特点 ,也是阅读别人代码的好机会。TopCoder还有一个深受大家喜欢的等级分系统(rating system),它会依据SRM的结果给参赛选手排名。另外,TopCoder还会举办一年一度的TCO(TopCoder Open)公开赛。一旦从在线进行的几轮预选中胜出,就能够参加在拉斯维加斯 举办的总决赛。 % w. J1 p& Y- y) f$ S& L( n* l6 T3 M5 i* f
历史最悠久的竞赛——ACM-ICPC0 T) `+ X# y- C& O4 C' ]. L; P
6 C# C) p4 s' c! j. x& ZACM-ICPC是由美国计算机协会(ACM)主办的、面向大学生的竞赛,也是历史最悠久的程序设计竞赛。这是一个三人一队的团队比赛,选手要在5个小时内解决大约10道题。因为比赛中三名选手共用一台电脑,题量又比其他赛事多,并且多是一些实现复杂的问题,所以团队配合显得异常重要。想要从日本参加该项赛事,首先要参加在线进行的国内预选赛,胜出后才能参加亚洲区域赛,取得前几名的好成绩后才能够参加世界总决赛。$ L8 ]. K, H g% S" Y P
4 f' u+ w3 q2 y. H讲到ACM-ICPC,不得不提到我们的《挑战程序设计竞赛》(第2版)译者,这颗闪耀在编程竞赛中的明星巫泽俊,就在2011年的5月30下午2时,他获得了第35届ACM国际大学生程序设计竞赛全球总决赛冠军,媒体称他为“世界最聪明的人”。(见下图) " j/ [8 U- j, w0 ]4 V J. g9 y. E$ o3 G; r z' E6 n! u6 w1 U4 P5 t& k1 G) S( ~2 ?9 _; ^1 G 3 ]8 x3 }$ w# N1 D( Z/ b5 i - [; P) c7 R2 k2 w: I3 A1 i& p巫泽俊平时训练的实验室: C. w" l% ]- O% r
% [7 F! I |+ H. E - k7 R6 L$ a/ z. M5 X9 c' v" K4 {% @8 L. c6 M# J) }0 J' l3 K% s
巫泽俊 8 X' D" {6 ?/ f" d. [" i 4 w& z# }& y; X1 y面向中学生的信息学奥林匹克竞赛——JOI-IOI 8 R* m% O; V' x; r! Y( q+ \# ^' m3 h& P+ s% t j6 a6 B
信息学奥林匹克竞赛是学科奥林匹克竞赛的一种,是以初中生和高中生为参赛对象的程序设计竞赛。在日本,首先要参加日本信息学奥林匹克竞赛,取得优异成绩后,才能作为日本国家队选手参加国际信息学奥林匹克竞赛。 其他比赛都需要尽可能快地解决尽可能多的问题,而信息学奥林匹克竞赛只要在规定时间内求解问题即可,成绩与所用时间无关,但是它相对其他比赛而言,求解每道题所花的时间要长得多。虽然是面向中学生的比赛,每年所出问题的难度却是非常高的。 - L6 K5 e0 Z( Y8 p: z) K3 }, D 4 J8 V+ o7 P$ Z0 V2 l( {% g( Q8 e通过网络自动评测——Online Judge(OJ) ]4 d5 x! r( b
7 y6 |6 Q0 w$ l) [ Y2 f8 R- f, l
在互联网上,有一些被称为Online Judge的系统,它们能够自动评测以往程序设计竞赛中的题目。利用该系统就可以练习了。另外,其中一些Online Judge也会定期举办自己的比赛,不妨去参加一下。在此列举几个有名的Online Judge。 i- U! K" U4 M. |" @
9 o( R8 ~' a) c8 C# fPKU Online Judge (POJ)—— 题库中有大量的题目。 1 V5 z+ [3 P# a! {; g6 ?会津大学Online Judge(AOJ)—— 还包含日语题。5 f# e3 j) ~, h7 |4 Z5 E( `
Sphere Online Judge(SPOJ)—— 允许使用各种各样的编程语言。) a( R7 r- ?5 a' |" z' o
SGU Online Contester—— 具有模拟参加历史比赛的虚拟赛功能。 5 |5 @1 v' b |$ c. o/ O2 I, a# QUVa Online Judge—— 老字号Online Judge,经常举办比赛。5 E7 p6 t) `5 E$ N6 h
Codecorces—— 与TopCoder一样定期举办比赛,又同其他网站一样不断维护历届题库。 & {1 ^, o4 ~ f1 H5 L2 A8 e关于本书 / }+ [2 T" N1 o; i- f; k2 B- d6 N/ M: G; r 1 v" i& F6 G$ @3 Z
0 M+ \( Y9 n* A) U
《挑战程序设计竞赛(第2版)》分为准备篇、初级篇、中级篇与高级篇4章。作者结合自己丰富的参赛经验,对严格筛选的110 多道各类试题进行了由易及难的细致讲解,每章后附有习题。 通过本书不仅可以学到算法,更能学到其设计和运用的思想。1 ~% f5 [( P# ~% D; z
, ]* |, B5 R6 w) L只要是具有编程基础知识的读者,均适合阅读本书。书中的源代码均用C++实现,不过只用到了其基本功能,所以即便读者不熟悉C++也不影响阅读。 8 x8 u- p' d/ x* O+ J' U1 M2 f, T# d
本书的第一版被台湾和韩国引进,获得了一致的好评,让我们看看其他两版的封面风格:), V Z; l, ]( t- }1 D
" S: `0 O. v* N: g 9 \" f* d S" O) v( _9 Q 8 C1 b5 U O- m# v3 M' g& U6 n