USACO 参赛资格
美国计算机编程算法竞赛 USACO (www.usaco.org)欢迎所有人参加。所有的新参赛者都是从铜级组开始的,那些在当前组别中得分特别高的人将在未来的比赛中被提升到下一个组别(由于每个比赛都不同,所以提升标准也不同)。只有非大学生才有资格被选为参加USACO训练营的决赛选手,并争夺美国IOI队的成员。参加比赛从不收取任何费用。
USACO 参赛诚信
USACO采取了严格的政策来确保竞赛的诚信。USACO 明确规定:
- 独立工作,而不是在团队环境中工作。
- 禁止与比赛负责人以外的人协商比赛问题。
- 不要提交过去与他人合作编写的程序。
- 鼓励参赛者不要使用书本或网站上的代码,也绝对不能在网上搜索确切的解决方案,或使用在USACO或类似网站上发布的解决方案。如果你必须从书本或网站上查找一些代码(或更普遍的,任何你没有从头开始写的东西),请在代码中插入一个注释,告诉来源。这条规则的目的是允许学生为一些小的代码查阅一般的参考资料,如如何调用标准库函数、读取输入、格式化输出等。学生不应该复制不是他们自己写的大段代码(例如,整个算法)。
- 不要使用两个登录ID,以便参加一个以上的部门。不要使用另一个登录ID来阅读问题,以规避比赛的时间限制。
- 不要提交任何对评分机有恶意行为的代码(即不要试图打开网络连接,有意降低评分机的速度,等等)。评判环境会对活动和系统调用进行监控,以防止被禁止的行为。
- 在比赛仍在进行时,不要分享参赛代码。
- 违反上述任何政策的参赛者将被终身禁止参加所有usaco活动。作弊者,取消将来参赛资格。
USACO 参赛技术要求
-
程序大小必须小于100,000字节,并且必须在30秒内完成编译。除非另有说明,你的程序将被限制在256MB左右的总内存使用。
-
请勿提交打开与竞赛任务无关的数据文件的程序。只读指定的输入文件,只写指定的输出文件。不要使用 "临时 "数据文件。
-
除非另有说明,否则程序必须是确定性的,并且每次在相同的输入情况下运行都会产生相同的答案。不具有确定性的程序可能会被取消资格。请注意,基于随机数的程序仍然可以参赛--它们应该使用一个固定的种子,以便每次都能得到相同的答案。
-
除非另有规定,否则不保证所有可能的合法数据集都能在规定时间内完美解决(例如,我们可能会提供一个任务,期望有接近最优的解决方案,并获得部分积分)。
-
尽管我们在设计问题时通常会使数字答案适合于一个标准的32位整数,但这并不保证。如果需要更大的数据类型(如64位整数),我们通常会在问题陈述中加以说明,以方便你使用,但最终你要负责意识到何时需要这些数据。
-
基本上只包含打印语句的程序将被取消资格。如果在比赛中提供了某些测试案例的反馈,那么你就不能重复提交基本上由打印语句组成的程序,以便对输入进行反向工程。程序必须实际计算所要求的答案,而不是仅仅打印预先计算好的查找表的结果。
-
程序不能停顿和等待按键。例如,如果你在代码中调用system ("pause"),评分环境可能会因等待一个不存在的按键而超时,返回一个类似 "空输出文件 "的错误。
-
过去的USACO竞赛中使用的标题(如PROB:和LANG:)不再需要了。相反,在提交代码时,请务必从下拉框中为你的程序选择正确的语言。
-
对于已编译的语言,你不需要删除所有的编译器警告。当然,编译器错误会使你的提交作品无法被评判。
-
有程序都从问题陈述中命名的文件中读取输入(例如,"cow.in")。不要在你的 "打开 "语句中指定一个完整的路径名称,只需要 "cow.in"。注意,文件名是区分大小写的。如果问题说 "cow.in",那么你必须使用 "cow.in",因为 "CoW.In "和 "COW.IN "将不起作用。所有程序都将其输出写入问题声明中命名的文件(例如,`cow.out');不要在你的`open'语句中指定路径名称,只需`cow.out'。与输入文件名一样,输出文件名也是区分大小写的。写到stdout或stderr的输出不会被分级。
-
几乎每个程序的输出都是以 "行 "的形式出现。由于这是一个UNIX环境,所有输入/输出文件中的行都以单个换行符"n "结束,而不是以回车符加换行符"rn "结束(尽管正确设计的程序一般不应关心使用哪种惯例)。如果你的输出在每一行的末尾不包含换行,它可能会被评为不正确。请注意,输入文件和输出文件的最后一行也应该以换行符"n "结尾--这是一个常见的错误来源;如果你在本地测试你的代码,请确保你的输入文件在最后一行的结尾有"n",特别是如果你在像Python这样的语言中使用split("n")来分隔各个行。这也许是我们收到的说 "它在我的系统上可以工作,但在比赛服务器上不行 "的邮件的首要原因。
-
对于一些输入量较大的高级问题,参赛者可能会从使用快速输入/输出中受益,从而更容易在规定时间内通过。对于C++用户,如果你使用cin/cout,你可能想在你的主方法的顶部添加 "ios_base::sync_with_stdio(false); cin.tie(0);" 。对于Java用户,你可能想用BufferedReader来代替Scanner。
-
针对Java:我们最近升级到使用Java 8而不是Java 7。两者之间一个明显的区别是string.split方法在对空字符串""进行分割时的行为,例如,如果你想将一个字符串分割成单个字符。在Java 7中,这将产生一个数组,其第一个元素总是空的,但在Java 8中不是。如果你在2017年1月比赛前或比赛中重新提交你以前提交的Java代码,你可能会因此看到不同的结果,由于这一变化。
-
如果随着时间的推移,你为一个问题提交了一个以上的解决方案,那么只有最后提交的那个方案才会被评分。这意味着如果你在提交后发现了一个错误,你可以重新提交。重新提交没有任何惩罚(不过请合理安排重新提交的速度,以减少服务器的负担)。当然,一旦你的计时器过期,就不能再提交解决方案。
-
评委们保留在评分过程中增加时间限制或增加/删除测试案例以得出最终结果的权利。
-
评委的决定是最终的。
USACO 参赛语言要求
-
C/C++程序。程序用gcc/g++ 4.8.2编译,使用"-O2 "优化标志和"-lm "来访问数学库,以及"-std=c++0x "来启用对C++11的支持。Ints大小为32位;如果你需要64位的整数,使用"long long"。要用C语言风格的I/O(如scanf、printf)读取或写入一个long long变量,请使用"%lld "格式字符串。
-
Pascal程序。程序用Free Pascal编译器2.6.2版编译时,使用"-O2 "标志来提供优化,并使用"-Sd "标志来指定int应该是32位大小。如果你需要一个64位的int,请使用 "int64 "数据类型。
-
Java程序。程序用Java 1.8.0_121版编译,用Oracle Java Runtime Environment执行(注意,这是最近才升级的;2017年1月之前(包括1月的比赛)所有提交的程序都使用了Java 7)。你必须在一个文件中提交你的整个程序,这个文件必须正好有一个与文件名称相同的公共类(例如,如果你的文件被称为 "MyFile.java",那么它应该包含 "公共类MyFile")。这个类需要有你的公共静态 void main 函数。文件中的所有其他类都应该在没有 "public "标签的情况下进行定义(例如,定义为 "class MyOtherClass")。不要在你的源代码中包含 "package "行。
-
Python程序。我们同时提供Python 2.7.6和Python 3.4.0;请确保在提交时选择正确的版本,因为通常情况下,为一个版本开发的程序在另一个版本中无法正常工作(使用 "python -version "来检查你本地Python解释器的版本)。还要注意的是,由于Python程序的速度较慢,即使给Python提交的程序规定了较长的时间限制,也可能无法解决某些问题的最大测试案例--对于执行时间很关键的问题,可以考虑使用更快的语言。执行过程中使用"-O "标志,以实现一些优化。
USACO 参赛形式
每场比赛通常有3...4个问题,你将提交C、C++、Java 或 Python 语言的解决程序。这些问题都是算法性质的,所以要在规定的时间内正确解决所有测试案例,可能需要巧妙的算法和/或数据结构。
你在每个问题上的得分取决于你的程序能在规定时间内解决的输入案例的数量(对于大多数比赛,C、C++每个输入案例2秒,Java和Python每个输入案例4秒,尽管每个比赛或问题可能使用稍微不同的限制)。所有的问题陈述都是直截了当的,没有刻意的 "隐藏技巧"(然而,请注意,合法但复杂的数据集是测试的公平游戏)。问题的目的是具有挑战性;很少有大量的竞争者获得接近完美的分数的情况。
比赛通常是3...4个小时的连续时间。你可以在你想要的任何时间段参加比赛,只要你在较大的比赛窗口内开始。当你开始比赛时,你的个人计时器开始倒计时,你将能够通过这个网站查看比赛问题并提交解决方案。当你提交一个程序时,它将与一些判断性的测试案例进行比对,对于每一个案例,你都会收到反馈,以彩色方框显示:绿色表示正确,红色表示不正确。不正确的提交会根据问题的类型进一步区分:X(不正确的答案),T(超过时间限制),!(运行时间错误或超过内存限制),E(空输出文件),或M(丢失输出文件)。
如果你的程序编译失败,你将会看到编译器的错误信息。第一个测试案例通常与问题陈述中描述的样本案例相同,你需要正确地解决它,然后才会得到其余案例的反馈(这些案例在比赛中不会被透露,尽管你会收到关于你是否解决了这些案例的反馈)。
评委们保留在比赛结束后增加或删除测试案例的权利,所以即使你的程序在比赛中通过了所有的案例,仍然值得测试。如果你在竞赛期间取得了特别高的分数(通常要求是满分),你可能有资格获得 "竞赛中 "的晋升;否则,晋升将在竞赛结束后授予所有分数高于该竞赛晋升门槛的参赛者。如果你获得了竞赛中的晋升,你将能够在更大的竞赛窗口内的任何时间开始进行下一次竞赛,并且有一个完整的计时器;也就是说,你在先前的竞赛中花费的时间不会算在你解决下一次竞赛的时间中。比赛的官方语言是英语,尽管我们尽量提供其他几种语言的问题集的翻译,以方便我们的国际竞争者。如果翻译之间有任何分歧,英语版本应被视为官方版本。