一、ACM竞赛介绍及规则1 A6 ~* s$ g. }& U6 Q" j
ACM/ICPC(国际大学生程序设计竞赛)是由ACM(Association for Computing Machinery,美国计算机协会)组织的年度性竞赛,始于1970年,是全球大学生计算机程序能力竞赛活动中最有影响的一项赛事。ACM/ICPC采用赛区选拔的方式产生参加世界决赛学校的资格, 2001年,来自全球超过25个地区1141所大学的2362支队伍参加了第26届ACM/ICPC的赛区竞赛。在2002年3月,来自世界各地的约60支队伍,200多名选手参加了夏威夷总决赛的角逐。可以说,ACM国际大学生程序设计竞赛是参赛选手展示计算机才华的广阔舞台,是著名大学计算机教育成果的直接体现,是信息企业与世界顶尖计算机人才对话的最好机会。在过去十几年中,世界著名信息企业APPLE、AT&T、MICROSOFT和IBM分别担任了竞赛的赞助商。中国大陆高校从1996年开始参加ACM/ICPC亚洲预赛,前五届ACM/ICPC亚洲区选拔赛在上海设有赛区,由上海大学主办。2002年,第六届ACM/ICPC亚洲预赛将该在北京设赛区,由清华大学主办。本次竞赛将于2002年10月在清华园拉开帷幕,预计将有超过60所国内外著名大学的上百支队伍参加本次竞赛(这也是北京工业大学首次参加此项赛事)。8 C7 n- w) n4 R
1 ^; o7 c: J( R7 `9 D. d
ACM竞赛规定,教练是参赛队伍所代表学校的正式教师,每支队伍最多由三名参赛队员组成,每支队伍中至少有两名参赛队员必须是未取得学士学位或同等学历的学生,取得学士学位超过两年,或进行研究生学习超过两年的学生不符合参赛队员的资格,任何参加过两次决赛的学生不得参加地区预赛或者世界决赛。 ( s* h5 L9 w& Q) Z# y/ n) W r$ s* j% I0 Q% ^" ]
竞赛中至少命题6题,至多命题10题,比赛时间为5个小时,参赛队员可以携带诸如书、手册、程序清单等参考资料,试题的解答提交裁判称为运行,每一次运行会被判为正确或者错误,判决结果会及时通知参赛队伍,正确解答中等数量及中等数量以上试题的队伍会根据解题数目进行排名,解题数在中等数量以下的队伍会得到确认但不会进行排名,在决定获奖和参加世界决赛的队伍时,如果多支队伍解题数量相同,则根据总用时加上惩罚时间进行排名,总用时和惩罚时间由每道解答正确的试题的用时加上惩罚时间而成。每道试题用时将从竞赛开始到试题解答被判定为正确为止,期间每一次错误的运行将被加罚20分钟时间,未正确解答的试题不记时,地区预赛可以使用的语言包括C/C++和Java,每支队伍使用一台计算机,所有队伍使用计算机的规格配置完全相同。(竞赛具体的软件环境可能根据赞助商的变化而变) x8 s. k' C4 i' d+ c! J8 v' t, f
二、关于竞赛的题型分析( d7 [0 ?# I; F; {* j: M! _
Hal Burch通过在1999年春季的分析得出了这样的结论,竞赛的程序设计一般只有16种类型,它们分别是: ' \. c- x+ V# W- I) `: Y ! o3 R+ ?& I8 ^: N, C, L/ ^, tDynamic Programming (动态规划) & O, k9 _1 ]6 [. r1 X
Greedy (贪心算法) ! L3 H8 k& ^' w& K
Complete Search (穷举搜索) 4 \( h' U8 N' ^% D6 L/ aFlood Fill (不知该如何翻译) - `* {4 O( n2 a: }1 S# LShortest Path (最短路径) % f7 B' L9 a( C4 M: b, U* XRecursive Search Techniques (回溯搜索技术) . A1 i5 G. `+ T: G% D
Minimum Spanning Tree (最小生成树) . k" B4 j1 Z9 |' vKnapsack (背包问题) ) y% A: t: @' Y+ `6 t- jComputational Geometry (计算几何学) 3 Y! S: A3 ~ I; ^& x2 v$ [2 j
Network Flow (网络流) " q% G* t) f! @5 J2 g7 l7 {$ w8 FEulerian Path (欧拉回路) $ K" E+ x) q+ H @1 p/ vTwo-Dimensional Convex Hull (凸包问题) 4 z7 O$ V% h4 x6 ~5 IBigNums (大数问题) , Q' _3 ]% @" q2 \0 q' n; n3 b a( p
Heuristic Search (启发式搜索) - Y& t7 S1 I7 l* i$ s; a) |" Y
Approximate Search (近似搜索) % s# ~5 E8 {4 a/ H3 n" _
Ad Hoc Problems (杂题)# }8 X9 q. ^: T/ ?# n+ S
) k3 J: M8 [+ r
很少有人能真正掌握这其中绝大部分的方法,而对于一些包含了这些方法组合与循环的具有挑战性的综合问题,多数选手都无能为力,因为竞赛中的很多试题都需要选手当场作出分析,而不是套用固定的解题格式,这是竞赛的困难所在,也是它的魅力所在。$ a- i+ M# m% W6 i0 ~8 r+ ]
: m" x+ Y; t1 Q" `. F3 O+ \4 v/ o
三、竞赛准备 ! a0 I& t2 y# @ACM竞赛不要求使用某一种特定的语言,所以各个队伍可以根据语言的特点和自己的特长选择,如果对语言的原理语法和特点均能做到成竹于胸、滥熟于心,在比赛的过程中就可以大大缩短调试的时间,从而获得优势。 8 j* O4 ~1 I' [# F - |5 `) o. a* {# m, R1 z然而编程之道就如武学之道,语言只是各门各派的武功招式,算法和数据结构则好比内功心法和武学原理。内力深厚,任何招式到了手上都能够化腐朽为神奇;掌握了武学原理,更能做到无招胜有招。选手在竞赛中最重要的素质,正体现于对算法和数据结构的掌握和理解上,通过对经典问题的分析,掌握各种算法的应用范围和数据结构的作用与具体实现,是每个选手在平时学习中的重点所在。& x; s8 d, z2 V' ~
2 e6 @2 m' ?0 D6 j四、竞赛策略# \6 n7 B7 ^* _1 U4 |+ W+ w) Y0 N
临近比赛,在实力上已经难有质的提高,这时我们不妨将注意力转移到竞赛技巧方面,做不成武学道师也学个韦小宝。在ACM竞赛中,一般来说能成功解决半数或以上题目的队伍已经是相当优秀的,解决所有问题近乎天方夜潭,也就是说无论你的实力如何,都还有很大的改进余地,这其中比较重要的就是竞赛的策略。' o' W/ a, Q/ K. |: o' p