学术活动方式
USACO 在学年期间定期举办基于网络的比赛,并在晚春举办美国公开赛,即我们的“全国冠军”考试。比赛通常连续进行三到五个小时,但为了获得最大的灵活性,您可以在周五至周一的比赛周末内的任何地方自由安排这段时间——当您登录比赛并下载时,您的计时器开始计时的问题。比赛任务在网络上呈现,您可以通过一个简单的网络界面提交您的最终解决方案。参与是免费的,对所有人开放。
比赛分为四个部分:
青铜级,适用于最近刚学会编程,但除了排序和二分查找等基本概念之外没有接受过算法培训的学生。
白银级,适用于开始学习基本问题解决技术(例如,递归搜索、贪心算法)和基本数据结构的学生。
黄金级,学生会遇到更复杂的标准算法(例如,最短路径、动态规划)和更高级的数据结构。
白金级,适用于在算法问题解决技术方面有很好基础的高级学生,他们希望用复杂和更开放的问题来挑战自己。
所有参赛者都从青铜组开始,在比赛中得分特别好的人将晋级到下一个组别。得分特别高的参赛者将在比赛进行时自动晋级下一个组别;其他人则需要等到比赛结束时公布结果,看看他们是否达到(取决于比赛的)晋升截止日期。
比赛形式
每场比赛通常有 3..4 个问题,您将用 C、C++、Java 或 Python 提交解决方案。问题本质上是算法问题,因此可能需要聪明的算法和/或数据结构才能在时限内正确解决所有测试用例。每个问题的分数取决于您的程序在时限内可以解决的输入案例数量(对于大多数比赛,C 和 C++ 每个输入案例 2 秒,Java 和 Python 每个输入案例 4 秒,尽管每次比赛或问题可能会使用略有不同的限制)。所有问题陈述都旨在直截了当,没有故意的“隐藏技巧”(但是,请注意,合法但复杂的数据集是测试的公平游戏)。问题旨在具有挑战性;
比赛通常持续 3..5 小时。您可以在较大的比赛窗口内的任何时间段内参加比赛。当您开始比赛时,您的个人计时器开始倒计时,您将可以通过本网站查看比赛问题并提交解决方案。
当你提交一个程序时,它会针对许多判断测试用例运行,对于每一个,你都会收到反馈,以彩色框显示:绿色表示正确,红色表示错误。不正确的提交根据问题的类型进一步区分:X(不正确的答案),T(超过时间限制),!(运行时错误或超出内存限制)、E(空输出文件)或 M(缺少输出文件)。如果您的程序无法编译,您将看到编译器的错误消息。第一个测试用例通常与问题陈述中描述的示例用例相同,您需要正确解决它,然后才能获得对其余案例的反馈(在比赛期间不会透露,即使您收到的反馈是否你是否解决了它们)。
如果您在比赛中获得满分,您就有资格获得“比赛中”晋级资格;否则,将在比赛结束后向所有分数高于该比赛晋级门槛的参与者授予晋级。如果您在比赛中获得晋升,您将能够在更大的比赛窗口内随时开始参加下一场比赛,并且有完整的计时器;也就是说,您在前一场比赛中花费的时间不计入您解决下一场比赛的时间。
比赛的官方语言是英语,尽管为了我们的国际参赛者的方便,我们尝试将问题集翻译成其他几种语言。如果翻译之间存在分歧,应将英文版本视为官方版本。
学术活动行为和学术诚信
USACO 坚信学术诚信,我们采取了严格的政策来确保我们比赛的诚信:
自己工作,而不是在团队环境中。
禁止使用生成式AI(例如,copilot 或 ChatGPT等服务)。
美国学生不应该在比赛期间使用vpn或相关技术来掩盖他们的IP地址(即,你的IP地址应该是你的学校或家庭互联网服务提供商的IP地址)。
禁止与学术活动总监以外的人就学术活动问题进行协商。
当比赛正在进行时,请勿分享与比赛相关的任何技术信息或代码。
USACO 学术活动环境旨在模仿国际信息学奥林匹克学术活动的环境,其中所有代码都必须从头开始编写,您可以参考的唯一参考资料是描述您的编程语言的语法或库函数的参考资料。因此,您可能不会使用预先编写的代码或“模板”来开始您的编码,并且您可能不会参考除提供有关您的编程语言的基本功能(例如,语法、库函数、输入/ 输出等)。(请注意,此特定规则已更新(截至 2020 年 12 月),比过去更清晰、更严格,所以如果您在过去的比赛中没有严格遵守上述规则,请不要担心)。
请勿使用两个登录 ID 参加多个部门。请勿使用其他登录 ID 阅读题目,以规避比赛时间限制。
不要向评分机提交任何行为恶意的代码(即不要尝试打开网络连接、故意减慢评分机等)。判断环境监控活动和系统调用以防止被禁止的行为。必须通过 usaco.org 网站上的界面提交代码(即选择您的文件并单击“提交解决方案”);不允许尝试通过其他方式提交(例如,尝试自动执行此过程的脚本)。
违反上述任何政策的参与者将被终身禁止参加所有 USACO 活动。不要作弊——没有第二次机会!(实际上,在 USACO 比赛中作弊对你没有任何好处;你可以通过诚实地尝试解决问题来学到更多!)。我们经常通过联系学生的老师或校长来跟进作弊行为;过去曾因此而被开除,所以要知道作弊的后果可能不仅仅是参加 USACO。
一般技术细节
您的程序的大小必须小于 100,000 字节并且必须在 30 秒或更短的时间内编译。除非另有说明,否则您的程序将被限制为大约 256MB 的总内存使用量。出现在评分服务器上但不出现在您家中的本地计算机上的“运行时错误”的一个常见来源是分配了过多的内存。
不要提交打开与手头比赛任务无关的数据文件的程序。只读输入文件,只写问题指定的输出文件。不要使用“临时”数据文件。
除非另有说明,否则程序在本质上必须是确定性的,并且每次使用相同的输入运行时都会产生相同的答案。不确定的程序可能会被取消资格。请注意,仍然可以输入基于随机数的程序——它们应该使用固定的种子,以便每次都能得到相同的答案。
除非另有说明,否则不保证所有可能的合法数据集都将在时限内完美解决(例如,我们可能会提供一个任务,其中预期接近最优的解决方案,并获得部分信用)。在某些问题上(尤其是高级别),由于速度较慢,可能无法使用 Python 在规定的运行时间内解决所有输入问题。我们一般会尽量保证所有的问题都可以在C/C++/Java中完全解决,所有铜牌级的问题也可以在Python中完全解决。
虽然我们通常设计问题以使数字答案适合标准的 32 位整数,但这并不能保证。如果需要更大的数据类型(例如,64 位整数),为了您的方便,我们通常会在问题陈述中注明这一点,但最终您有责任了解何时需要这些数据。
基本上只包含打印语句的程序可能会被取消资格。如果在比赛期间提供了对某些测试用例的反馈,则您不得提交包含基本打印语句的重复程序,以对输入进行逆向工程。程序必须实际计算请求的答案,而不仅仅是从预先计算的查找表中打印结果。
程序不得暂停并等待按键。例如,如果您从代码中调用 system("pause"),评分环境可能会在等待不存在的按键时超时,并返回类似“空输出文件”的错误。
不再需要在过去的 USACO 比赛和我们的训练系统中使用的标头(例如,PROB: 和 LANG:)。相反,请务必在提交代码时从下拉框中为您的程序选择正确的语言。
对于编译语言,您不需要删除所有编译器警告。当然,编译器错误会阻止您提交的内容被评判。
一些程序——特别是 2020 年 12 月学术活动之前的大多数任务的解决方案——将从问题陈述中命名的文件(例如,“cow.in”)中读取它们的输入。如果您正在使用文件输入,请不要在 `open' 语句中指定完整的路径名,只需指定 `cow.in'。请注意,文件名区分大小写。如果问题是“cow.in”,那么你必须使用“cow.in”,因为“CoW.In”和“COW.IN”将不起作用。一些程序将它们的输出写入问题陈述中命名的文件(例如,“cow.out”);不要在 `open' 语句中指定路径名,只需指定 `cow.out'。与输入文件名一样,输出文件名区分大小写。如果问题使用文件输入/输出,则写入 stdout 或 stderr 的输出将不会被评分。请注意,截至 2020 年 12 月的比赛,输入和输出从基于文件切换到基于终端,使用标准输入和标准输出(例如,C++ 中的 cin 和 cout)。问题的输入和输出规范将指定正在使用的模式。
实际上每个程序的输出都是“行”的形式。由于这是一个 UNIX 环境,所有输入/输出文件中的行都以单个换行符“\n”终止,而不是回车加换行符“\r\n”(尽管正确设计的程序通常不关心哪个约定正在使用)。如果您的输出不包含每行末尾的换行符,则它可能被评为不正确。请注意,输入文件和输出文件的最后一行也应以换行符“\n”结尾——这是错误的常见来源:如果您在本地测试代码,请确保您的输入文件以“\ n" 在最后一行的末尾,特别是如果您使用 split("\n") 来分隔像 Python 这样的语言中的各个行。
对于一些输入量更大的更高级的问题,参赛者可能会受益于使用快速输入/输出,从而更容易在时限内通过。对于 C++ 用户,您可能需要添加“ios_base::sync_with_stdio(false); cin.tie(0);” 如果您使用的是 cin/cout,则在您的主要方法的顶部。对于 Java 用户,您可能希望使用 BufferedReader 而不是 Scanner。
特定于 Java:我们最近升级为使用 Java 8 而不是 Java 7。两者之间的一个显着区别是 string.split 方法在拆分空字符串“”时的行为,例如,如果你想拆分一个字符串成其个别字符。在 Java 7 中,这将生成一个第一个元素始终为空的数组,但在 Java 8 中则不然。如果您重新提交之前在 2017 年 1 月学术活动之前或学术活动中提交的 Java 代码,您可能会因此看到不同的结果,因为此更改.
如果随着时间的推移,您为一个问题提交了多个解决方案,则只会对最后提交的解决方案进行评分。这意味着如果您在提交后发现错误,您可以重新提交。重新提交不会受到惩罚(尽管请合理调整您的重新提交率以减少服务器负载)。当然,一旦你的计时器到期,就不能再提交更多的解决方案。
评委保留在评分期间增加时间限制或添加/删除测试用例以产生最终结果的权利。
评委的决定为最终决定。
特定于语言的技术细节
对于C/C++程序员:程序使用 gcc/g++ 7.5.0 编译,使用“-O2”优化标志和“-lm”访问数学库,以及“-std=c++11”或“-std= c++17" 启用对 C++11 或 C++17 的支持。Int 的大小为 32 位;如果需要 64 位整数,请使用“long long”。要使用 C 风格的 I/O(例如,scanf、printf)读取或写入 long long 变量,请使用“%lld”格式字符串。
对于Java程序员:程序是使用 OpenJDK 运行时环境 11.0.10 版(我们最近从 Java 8 升级到 Java 11)编译和执行的。你必须在一个文件中提交你的整个程序,并且这个文件必须有一个与文件同名的公共类(例如,如果你的文件名为“MyFile.java”,那么它应该包含“public class MyFile”) . 这个类需要有你的 public static void main 函数。文件中的所有其他类都应该在没有“public”标签的情况下定义(例如,作为“class MyOtherClass”)。不要在源代码中包含“package”行。
对于Python程序员:我们同时提供 Python 2.7.17 和 Python 3.6.9;请务必在提交时选择正确的版本,因为通常情况下,为一个版本开发的程序在另一个版本中无法正常工作(使用“python --version”检查您本地 Python 解释器的版本)。请注意,由于 Python 的速度较慢,我们不能总是保证可以解决某些问题的最大测试用例,即使 Python 提交的时间限制过长(我们尽最大努力设计我们的学术活动,因此它们是Python 程序员可以访问,特别是在较低的部门,但是一旦你升到更高的部门,运行时间变得更加关键,你最终可能希望考虑学习一门更快的语言)。使用“-O”运行执行
请注意,Pascal 支持已停止。
澄清,联系比赛组织者
如果您发现问题措辞不当或含糊不清,您可以发送电子邮件给学术活动组织者 Brian Dean (bcdean@clemson.edu),请求澄清;您可能只会收到“更仔细地阅读问题”的回复,尽管有价值的重要澄清将发布在学术活动页面上。
如果您将学术活动电子邮件发送至 bcdean@clemson.edu,请确保主题包含“USACO”一词,并且请注意时区——美国东部标准时间 (EST) 的白天时间之前不会有回复。