美国计算机编程算法竞赛 USACO (www.usaco.org)是一个电脑编程以及算法竞赛。为每年的国际计算机竞赛IOI (Informatics Olympiad International) 选拔美国队队员。
计算机奥赛(USACO)与数学奥赛(USAMO),都是国家National 级别的奥赛,是美国国家队选拔赛。参加两个国际奥林匹克赛的美国选手是通过这两个全国比赛层层选拔出来的。AMC考察数学,USACO考察编程和算法。USAMO的参加的学生很多,相对参加USACO的要少些。因为参加人数不是太多,比数学竞赛更容易入围,进级。
USACO 和 AMC:
AMC10≈USACO Bronze
AMC12≈USACO Silver
AIME≈USACO Gold
USAMO≈USACO Platinum
USACO是一个“算法”竞赛,这意味着参赛者需要用创造和系统的方法来解决问题,而不仅仅是直接把程序的描述直接转换成代码。例如,“找出列表里面最大数字的位置”是一个非常简单的算法问题,但“写出先画一个圆圈,再画一个正方形的指令”就是另外一回事了。
USACO 参赛形式
通过登录USACO官网,在线提交代码的形式参赛。在比赛规定的时间范围内(通常是4天,期间覆盖一个周末 。你有4天的时间来开始比赛选择一个适合你的时间,竞赛不允许有任何外部帮助和合作。一旦比赛开始,你有3-4个小时的时间查看和解决3个独立的编程问题。在线打开题目,在线提交代码。代码提交后,系统会自动给出评分。从打开题目算起,选手需要完成3道题目。代码提交后,系统会自动给出评分,如果拿到了满分,系统会提示直接晋级,则可在本次月赛中继续挑战更高难度的试题。一般情况下,月赛考试结束后,会划出晋级分数线。如果成功晋级,可在下个月的比赛中参加更高级别的竞赛。
所有3个编程问题的分值都是333.333分,总分是1000分。对于每个问题,分数在每个测试案例中平均分配。如果问题1有10个测试案例,问题2有11个,问题3有12个测试案例,那么问题1的每个测试案例价值33.33分,问题2的每个测试案例价值30分,而问题3的每个测试案例价值27.77分。
注册USACO也很简单,只需要在www.usaco.org注册一个免费账户,注册时你不需要选择特定的比赛日期。只要你有了这个账户,可以在比赛日期随时参与竞赛。USACO 竞赛是完全免费的!你只需要注册一个账户,就可以参加比赛了。USACO 解题绝对不可以在网上复制别人的代码!不要复制抄袭,一经发现永久封号。
USACO 参赛时间
USACO在每年12月-次年3月,每个赛季有4场比赛. 12月月赛, 1月月赛, 2月月赛, 3月公开赛。前三场比赛的形式是相同的。请查看USACO网站的主页最新发布时间。
USACO 12月考试是4次中最容易的一次,秋季班冲刺至关重要。错过了要等一年,考题每年难度都在大幅度提升,考试形式也可能变化。12月的月赛通常是圣诞前的一个周末,当场出成绩,一周内放榜,也非常适合在RD的截止前冲击申请材料的最后一个闪光点。1,2月份的成绩也可以作为申请递交完毕最好的补充材料。
USACO 参赛级别
USACO 竞赛有4个级别,铜级,银级,金级,白金级。每个级别代表不同的编程技能水平。在每场月赛中,题目难度分为铜级、银级、金级、铂金级四种级别,难度依次提高。新注册的选手从铜级开始,在规定的时间内完成3道题目,如果过关,可晋级到更高级别。
每个人都必须从铜级开始参赛。在每个USACO比赛中,每个技能水平都有一个比赛(例如,银级选手不会和铜级选手参加同一个比赛)。以下是每个级别的编程比赛中你需要知道的内容/如何通过每个级别的编程比赛。
铜级: 是USACO的基础级别。主要考察编程知识的掌握程度,排序、二分查找。大多数铜级问题没有像高级别的那样有很多效率问题。要能够解释一个编程问题。知道/能够创建基本算法和逻辑。循环,数组,内部算法,知道/能够将自己的想法转化为代码。
银级:银级考试比铜级考试要难得多。涉及递归搜索、贪心算法等基本的问题求解技术;了解最基础的数据结构概念, 要考察效率问题。
金级:设计更复杂的标准算法(例如最短路径,动态规划等),熟练掌握数据结构, 主要考察效率问题。
铂金级:对算法有深入了解,熟练应用,能解决复杂问题、开放问题。
USACO 参赛语言
可以使用的参赛编程语言列表如下:Java、C++ 17、C++ 11、C、Python 2 (2.7.17)、Python 3 (3.6.9)
C++ 是奥计考试的主选语言之一,起步难但程序紧凑效率高,适合金级以上考生利用网上资料自学自修。C++是高效编程语言,网上有很多资料,适合金级白金级自学,但语言难学,初学者进步很慢。
Java 是奥计考试的主选语言之一,易学易升级,又可以拿到APComputer高分。
Python 是奥计考试的主选语言之一,易学易考,适合人工智能和机器学习,是当今的大热门。
USACO 参赛评级
USACO系统自动评分。测试案例的数量会因问题而异(通常为10个左右)。每个测试案例都有相等的分值,所有测试案例的总分值为333分。有时,较早的测试用例在其所需的时间复杂度方面会明显容易。这意味着,如果你的代码效率很低,它应该仍然能够获得前几个测试用例的部分积分。重新提交没有任何惩罚。
但是,如果你多次提交,你提交的最后一次(不是最好的)将被算作你的分数。如果你的程序不能编译,缺少输出,或有运行时错误,提交将失败(将不被评分),你将被告知错误。在评分开始前,你的程序也必须首先获得样本案例的正确性。
一旦你的程序通过了初始编译和样本测试案例,它将针对所有的测试案例运行。对于导致测试用例失败的原因,有几个可能性:
T:超时(在Java和Python中为你提供4秒,在其他语言中为你的代码成功运行并返回解决方案提供2秒)。
!: 运行时错误(典型的运行时错误,但也包括超过内存限制,这很罕见,但可能发生)
X:错误的答案(你对测试案例的答案是不正确的)
如果你能在比赛中得到1000/1000分(通过每一个测试案例),你就会得到一个比赛中的晋升。(获得赛中晋级的分数有时会低于1000分,不过这种情况非常罕见)。这意味着你可以在当前4天的竞赛窗口中开始下一级的竞赛(你不必等待窗口结束来获得晋升。)
否则,你必须等到窗口结束后才能晋级。USACO将根据比赛结果计算出截止分数,如果你的分数高于截止分数,你将被提升到下一个级别。根据不同的比赛,高于750分或800分的分数通常会让你晋升。
然而,作为USACO全国锦标赛的美国公开赛有一些小的区别(其他方面都是一样的)。问题的难度要大得多。比赛时间多1小时。
USACO 的含金量
USACO是美国大学申请过程中非常有含金量和竞争力的一个STEM竞赛。USACO 还有一个更大的好处在于,实用性很广,实战性很强。就算不参加奥林匹克比赛。USACO 也能够帮助孩子在最短的时间内,有效的提高和掌握电脑编程语言,增加电脑技能。对孩子将来的发展有更深远的影响和帮助。随着STEM教育的理念,及编程低龄化,普及化的发展,USACO的参赛人数和热度越来越高。
USACO是不仅仅是一项可以让申请者迅速提高STEM,编程算法学术背景的比赛,编程本身作为一门使用技能也会让学理工科的学生受益终生,即便是商科文科的同学,编程训练本身带来的思维优势也可以极大的促进学习。
因为大量的中国学生热衷于参加热门的美国数学奥赛、美国化学奥赛,所以USACO在中国的普及度并不高。这意味着参赛选手少,获奖选手也少,含金量自然更高。