ACM国际大学生程序设计竞赛(英文全称:ACM International Collegiate Programming Contest(ACM-ICPC或ICPC)是由美国计算机协会(ACM)主办的,一项旨在展示大学生创新能力、团队精神和在压力下编写程序、分析和解 决问题能力的年度竞赛。经过近30多年的发展,ACM国际大学生程序设计竞赛已经发展成为最具影响力的大学生计算机竞赛。赛事目前由IBM公司赞助。
北大ACM的地址: http://acm.pku.edu.cn
如何在北大ACM中提交问题的解答?
1.在北大ACM中注册并登陆
2.点击“Problems”按钮查看所有的问题列表
3.点击“Submit Problem”按钮提交问题解答
4.在打开的页面中输入问题ID,选择语言类型,并粘贴代码
5.在“Online Status”中查看状态,可以按照问题ID,以及用户名进行过滤。
以下的北大ACM系统的FAQ,由英文原文翻译所得:
Q : 你的程序从哪里获取输入,向何处输出?
A : 你的程序只能从stdin获取输入,向stdout进行输出。例如:可以使用C语言中的scanf获取C++中的cin获取输入,而使用C语言中的printf或者C++中的cout进行输出。 你的程序绝对不能尝试去打开或者读写文件 ,否则将给出运行时错误提示或者错误答案。
Q : ACM使用的编译器是什么?
A : 当前支持7种语言,6种编译器。C和C++使用VC++ 2008 Express版。Java使用JDK1.5.0。
import java.util.*; public class Main { public static void main(String args[]) { Scanner cin = new Scanner(System.in); int a = cin.nextInt(), b = cin.nextInt(); System.out.println(a + b); } }
使用Java语言尤其需要注意:
提交的Java程序必须是一个单源文件,并且是一个以Main命名的类,中间的执行代码在静态的main函数中,否则会引起编译错误。
Q : 我的程序如何被判定?
A : 1. 你提交的程序首先将被保存在一个文件中,然后使用选定语言中的编译器进行编译。如果编译失败,将返回“Compile Error”。
2. 接下来将会运行你的程序,提供输入并且进行计时。输入数据被保存至一个或多个文件中。每个文件都被用于判定你的程序。程序运行过程中,如果发现你的程序运行状态超过阈值(Runtime Error,Time Limit Exceed,Memory Llimit Exceed,Output Limited Exceed),结果将会被立即返回,不会做进一步的判定。这意味着如果出现了TLE或者MLE,并不意味着你的程序在提供了足够的资源后将正确运行。当你的程序结束一个输入文件并制造了一些输出并存储在一个输出文件中,将会用这个输出文件与正确的输出进行比较。如果输出不正确,则会给出Wrong Answer的提示。否则将会继续处理下一个输入文件。当所有的输入文件处理结束后,如果没有出现Presentation Error,则会返回Accepted。
Q : 返回信息都是什么意思?
A :
Waiting : 你的程序正在被进行判定,或者等候被判定
Accepted (AC) : 恭喜!你的程序已经生成了正确的结果。
Presentation Error (PE) : 你的程序的输出格式不能完全匹配与所期望的结果,虽然输出是正确的。这通常意味着在两个非空白的字符之间存在着多余或缺失的空格(空格,Tab,换行),或者在两个非空白行之间存在空白行。在行后的空白字符以及文件后的空白行将不会被认为是格式错误。
Wrong Answer (WA) : 你的程序没有生成正确的输出,特别判定程序会返回Wrong Answer而不是Presentation Error,以确保简单性和健壮性。
Runtime Error (RE) : 你的程序在运行中出错。可能的原因有非法文件访问,堆栈溢出,指针引用越界,浮点异常,除以零等等。如果程序长时间处于等待状态而没有使用CPU进行计算,可能被认为是出现了RE。
Time Limit Exceed (TLE) : 程序运行总时间超出限制。
每一个Problem都有两种时间限制,Total Time Limit和Case Time Limit。前者是你的程序处理所有输入文件的总时间,后者是你的程序处理单个输入文件的时间,超过两者其一都会产生TLE。如果你被返回了TLE但是你的程序运行时间在限制范围内,则你的程序一定是超过了CASE TIME LIMIT。
如果一个Problem没有指定具体的单个输入文件运行时间,则只适用总时间限制。
Memory Limit Exceed (MLE) : 你的程序超出内存使用限制。
Output Limit Exceed (OLE) : 你的程序生成了过多的输出。当前的限制是期望输出的两倍大小。出现这种情况的原因可能是你的程序出现了死循环。
Compile Error (CE) : 程序编译失败。可以查看编译器生成的警告和错误消息。
No such problem: 可能由于你提交了一个不存在的题目ID或者此题目当前处于不可用状态
System Error : 你的程序无法运行。比如你的程序请求了硬件限制之上太多的内存。
Validate Error: 特别判定程序在检查你的输出时出错,意味着特别判定程序可能存在缺陷,请联系管理员,当然也有可能是你的程序的问题。
Q : 时间限制是1000MS,但是有些人的程序几秒钟才运行完,仍然得到Accepted
A : 大多数这样的程序都是java程序,Java程序的时间限制放宽到总时间限制的三倍。并且对于每个输入文件处理额外给出150MS的时间。
Q : 我的程序只比时间限制慢了15MS,怎样才能提升?
A : 大多数情况下你的程序实际比时间限制更慢,因为在超过时限时判定程序将结束你的程序进程。通常这会产生15MS。通用的性能提升技巧在于使用有效的算法。