算法竞赛

算法竞赛（又稱編程競賽、信息学竞赛、程式設計競賽），不同於-{zh-hans:黑客松; zh-hant:駭客松}-是一项智力运动，通常在互联网上或局域网上举行，其内容包括参与者尝试根据提供的要求进行编程 。 参赛者被称为競賽程序員 。算法竞赛得到了多家跨国软件和互联网公司的认可和支持，例如Google和Facebook。

算法竞赛通常涉及到主办方向参赛者提出一组逻辑或数学问题（参赛者的数量可能从几万到数千不等），并且要求参赛者编写能够解决每个问题的计算机程序。评测主要基于解决的问题数量和编写成功解决问题的程序所花费的时间，但也可能包括其他因素（产生的输出质量，执行时间，程序大小等）。

历史 
已知的最古老的竞赛之一是国际大学生程序设计竞赛，该竞赛起源于1977年，2011年中参赛者范围已经扩大到88个国家/地区。自从2000年以来，它也同时与Internet的发展有了很强的联系。这促进了在网上举办比赛，同时也消除了地理性的问题。

概述 
算法竞赛的目标是编制源代码，在有限的计算资源内来解决给出的问题。大部分的问题是屬於数学问题或者逻辑学问题。它们通常属于下面几个类型中的一个：组合数学、数论、图论、几何（很多时候是计算几何）、字符串和数据结构。和人工智能相关的内容在某些比赛中也很會出現。

不论问题的类别，解决问题的过程都可以大致地分为两大步骤：構思一个算法，以及使用一个编程语言来实现算法（允许使用的语言每个竞赛都会不同，主要以C++，Java，Pascal等为主，但是IT企业的竞赛大多会使用该企业的常用语言）。

大多数竞赛中，选手只应该為每一題编写一个源程序，这个源程序的系统调用会受到限制。一般创建新进程，访问网络，操作无关文件等等都是不允许的。一般情况下，选手只能使用他/她所使用的语言的标准库（例如C++语言的STL）。

一道传统的题目由以下几个部分组成。下面使用大多数OJ使用的试机题目A+B问题来做简要的阐述：

试题 
在一般的竞赛中，试题有以下几种。

 传统题要求程序从输入读入一些数据，进行求解后输出，这是最常见的题目。

 提交答案题会事先下发输入数据，选手需要通过任意方法（包括计算器、手算、编写程序等）进行求解，并提交答案文件。

 交互题会让选手程序与交互系统进行交互，一般会通过输入输出或者调用给定函数库来实现。例如 NOI 2019. I 君的探险 

 通信题要求选手编写两个相互协作的程序解决问题。例如 UER #8. 打雪仗

赛制与测评 

在大多数竞赛中，评测是通过主办者的计算机进行的，这通常称为裁判系統。裁判会对选手提交的代码通过一组（通常是秘密的）测试数据进行测试。测试方法是所谓的黑箱测试，也即，裁判不关心选手的程序是如何实现的，而只要求它能够在规定的限制内正确地解答出问题。

大多数竞赛中，选手在提交代码之后能够即时获取反馈，一般反馈分为以下几种：
 AC (Accepted)：通过，选手程序完成了任务。
 PE (Presentation Error)：输出格式错误，选手程序输出答案正确，但是格式错误（例如，行中间出现空格），在某些竞赛中被视作 WA。
 WA (Wrong Answer）：答案错误，选手程序尽管成功运行，但并没有成功求解问题。
 TLE (Time Limit Exceeded)：超出时间限制，选手程序运行时超出了题目给出的时间限制。
 MLE (Memory Limit Exceeded)：超出空间限制，选手程序所使用的空间超过了题目给出的内存限制。在极少数竞赛中（例如USACO）被视作 RE。
 RE/RTE (Runtime Error) ：运行时错误，选手程序崩溃。
 OLE (Output Limit Exceeded) ：输出超过限制，选手程序输出了过多内容。
 CE (Compile Error) ：编译出错，选手程序没有成功编译。
 IE/SE (Internal Error/System Error) ：内部错误，评测系统出错。这时选手应当报告比赛主办方。某些平台细分为多种 （例如 Compilation Failed 编译器错误， Denial of Judgement 拒绝评测，Judgement Failed 评测失败，Checker Crashed 比较器崩溃等）。

另一些竞赛 （例如NOI）不提供即时反馈。系统在竞赛结束后会统一评测。

有些竞赛只有“对”和“不对”之分，没有部分分。例如ICPC。而另一些竞赛会按照测试点或者子任务分别给分。有时，还会按照解的优劣性进行部分给分。

对于传统题，一般判断答案正确的方法是在过滤行末空格和文末回车之后逐行比对，但是，有的题目会使用特制的比较器来进行测评。对于其他类型的题目则一般通过比较器进行给分。

大多数竞赛要求选手程序从标准输入读入数据，将答案写到标准输出，而早期竞赛和NOI系列赛则要求选手从给定的输入文件读入数据，将答案写到输出文件。

主要竞赛 
比赛分为短期和长期两种。

短期 
中國
 NOI -  中国 自 1984 年起举办的竞赛。
香港
 香港電腦奧林匹克 - 香港 自 1997 年起舉辦的競賽
台灣
 高級中學數理及資訊學科能力競賽 - 臺灣 自 1999 年起舉辦的競賽
 臺灣國際奧林匹亞競賽 -  臺灣用於選拔國際資訊奧林匹亞選手的比賽，由國立臺灣師範大學資訊工程學系主辦
國際/其他地區
 国际大学生程序设计竞赛 (ICPC) - 历史最悠久的竞赛之一，由大学生三个人组队参加；
 CodeChef - 从2009年起，每个月会有两场短竞赛 和每年一场的CodeChef SnackDown；
 Codeforces Round - 一般是两小时，每星期举行；
 Facebook Hacker Cup - 由 Facebook 提供和支持的竞赛；
 HackerRank - 數种竞赛；
 Google Code Jam - 由 Google 提供和支持的竞赛
 IEEEXtreme Programming Competition -  IEEE为其学生会员举办的竞赛。
 国际信息学奥林匹克 - 面向中学生的最古老竞赛之一。

上述大多数竞赛都按轮举行，在NOI, IOI, ICPC等竞赛中，获得好成绩的选手可以获得金牌、银牌或铜牌。

长期 

 HackerRank Week of Code
 Topcoder 马拉松

在线资源 
有许多在线评测系统可以提供训练资源。以下僅列出較常見的評測系統。

非中国地区 

 Codechef是印度的在线评测系统，也提供比赛。
 AtCoder是日本的在线评测系统，提供比赛。
 Codeforces是俄罗斯的评测系统，提供比赛。
 UVa是西班牙的评测系统，收录了大量 ICPC 的真题，题目质量较高。现在已经去掉了这个名称而直接叫做Online Judge。
 SPOJ是波兰的评测系统。
 SZKOPUL收录了波兰信息学奥林匹克的很多试题。

中国地区 

POJ是北京大学的评测系统。收录了不少亚洲区 ICPC 真题。
ZOJ是浙江大学的评测系统。
LibreOJ是由网名 Menci 的 OI 选手维护的在线评测系统，理念是自由开放。
UOJ是由网名 vfleaking 的 OI 选手维护的在线评测系统，理念是接受一切试题的评测。
评测鸭是由王逸松开发的评测系统，能够将时间计算精确到纳秒。
洛谷是上海洛谷网络科技有限公司的评测系统，提供收费的网校服务。
香港電腦奧林匹克競賽網上評測系統 (HKOI Online Judge) 原為集訓隊的訓練平台，現已開放予全港中學使用。
AcWing 是北京睿新奇知科技有限公司旗下品牌，拥有优秀的算法在线课堂，以及 AC Saber。

臺灣地區 

Zerojudge是台灣最大的評測系統，題目來源較為廣泛。
Green Judge是由台中女中建立的評測系統，以新手向題目為主
TIOJ是建國中學的評測系統。

参考文献 

程序设计竞赛