1.什么是online judge?

在线判题系统(英语:Online Judge,缩写OJ)是一种在编程竞赛中用来测试参赛程序的在线系统,也可以用于平时练习。
OJ系统能够编译并执行代码,使用预设的数据对这些程序进行测试。提交的代码一般会在受限的环境下运行,包括时间限制、内存限制、安全限制等。代码的输出会被OJ系统捕获,与标准答案进行比较后返回结果。
简单来说,你需要根据题目编写好代码提交到服务器,OJ会帮你把代码编译为程序并用事先准备好的数据对你的程序进行测试,根据测试结果返回不同的结果如:程序通过、错误答案、超时、运行时错误、编译错误等等。
OJ网站会对用户进行排名,以用户的提交答案通过数多少或某个题目执行时间快慢为排名依据。

2.经常用到的OJ

1.Virtual Judge:https://vjudge.net/

融合了许多其他oj,是实验室平时训练及训练赛的主基地。

2.AcWing: https://www.acwing.com/

新兴的OJ平台,可以查看错误数据,功能比较完善

3.HDU:http://acm.hdu.edu.cn/

国内老牌oj,新生可以考虑先刷11页水题100道

4.CodeForces:http://codeforces.com/

国际老牌oj,有天梯排名,具有较大参考价值

5.洛谷:https://www.luogu.com.cn/

6.PTA:https://pintia.cn/

7.牛客网:https://www.nowcoder.com/

8.学校自建OJ:http://acm.nuc.edu.cn/

新生赛一般在这上面进行,平时不一定进得去

3.Virtual Judge的食用方法:

image.png
首先注册一个账号并登录,之后会让你们加入NUC-ACM2020组
之后培训及训练中学长们会在“比赛”一栏留出作业题,进入某题目后如下页面:
image.png
如果你已经在本地写完代码,点击提交,写好的代码全部粘贴上去,再次点击提交。
image.png
之后弹出窗口,稍作等待
image.png
注意箭头所指地方,即为你的程序测评结果,具体含义会在下文说明。

4.HUD OJ的食用方法

大同小异
image.png
image.png

image.pngimage.png

image.png

5.返回结果的意义

image.png
在英文OJ中对应关系如下:
Accept**(AC):答案正确
Presentation Error**(PE):格式错误
Wrong Answer**(WA):答案错误
Time Limit Execeed**(TLE):运行超时
Memory Limit Exceed**(MLE):内存超限
Output Limit Exceed**(OLE):输出超限
Runtime Error**(RE):运行时错误
Compile Error**(CE):编译错误
Unknown Error:未知错误
Submit Error:提交失败
Queuing && Judging:正在排队&&测试
System Error:内部错误
**

6.常见问题**

为什么我的程序提交后显示”答案错误”/“部分正确”/“段错误”/…,而在自己的机器上运行可以得到正确的答案?
除了题目描述中的数据外,本系统还会使用多组不同的有挑战性的数据测试你提交的程序。请检查你的程序,确保它能正确地处理题目描述范围内的所有情况。
我应该从哪里读输入,另外应该输出到哪里?
如果没有特别说明,你的程序应该从标准输入(stdin,传统意义上的“键盘”)读入,并输出到标准输出(stdout,传统意义上的“屏幕”),不要使用文件做输入输出。由于系统是在你的程序运行结束后开始检查输出是否是正确的,对于有多组测试数据的输入,可以全部读入之后再输出,也可以处理一组测试数据就输出一组。

  1. 在C语言中,你应该使用scanf/printf组合,gets(), getchar(), puts(), putchar()函数,而不是fopen(), freopen()等文件操作函数。
  2. 在C++语言中,你应该使用cin/cout组合,getline()函数,而不是fstrem头文件中的文件相关函数
  3. 在Java中,你应该使用nextXXX()方法/System.out.printXXX()方法,而不是使用文件操作。

为什么我的程序交在这里得到编译错误,而我在自己的机器上已经编译通过了?
本系统所使用的编译器和你在自己机器上使用的可能有区别,请留意几个常见的地方:

  • 本系统是 64 位 Linux 系统,使用的编译器版本和编译参数可以参见编译器帮助
  • Java 代码需使用 Main 作为主类名
  • Visual C++ 6.0 和 Turbo C++ 3.0 (及它们的更低版本)有较多违背 C++ 标准(ISO/IEC 14882)的地方,不要使用它们来判断 C++ 程序语法上是否有问题
  • C++ 下 64 位整数的类型是 long long,不要使用 __int64

为什么我的程序得到了“非零返回”?
返回零表示一个程序正常结束,如果没有返回零,则系统认为程序没有正常结束,这时即便输出了正确的内容也不予通过。

  • C 或 C++ 代码请确认 int main 函数最终会返回 0,不要声明为 double main 或者 void main
  • 有异常的语言,请确认程序处理了可能抛出的异常

程序的时间和内存占用是如何计算的?
程序的运行时间为程序在所有 CPU 核占用的时间之和,内存占用取程序运行开始到结束占用内存的最大值。

为什么同样的程序运行时间和所用内存会不同?
程序运行时间会受到许多因素的影响,尤其是在现代多任务操作系统以及在使用动态库的情况下,多次使用同一输入运行同一程序所需时间和内存有一些不同是正常现象。我们的题目给出的运行限制一般为标准程序的若干倍,也就是说,选用正确的算法和合适的语言,那么运行限制是富余的。

不同语言的时间限制和内存限制是相同的吗?
是相同的,我们认为选择合适的编程语言也是一项必备技能,所以没有为不同语言设置不同的限制条件。

我提交的代码可以做什么,有什么限制吗?
没有。这里没有系统调用白名单,也没有针对语言限制可使用的包或库。虽然我们比较宽容大度,但还是请不要做不符合道义的事情。如果你需要使用我们系统没有提供的某个语言的某个库,或者需要更改编译参数,可以联系我们。

其他问题
在考试或比赛中遇到其他问题请咨询现场工作人员。

常见C语言程序问题
以下内容摘自浙大版《C语言程序设计(第3版)》。
(1) main的问题
错误的例子:

  1. void main()
  2. {
  3. printf("hello\n");
  4. }

函数main()的返回类型必须是int,在main()里一定要有一句

  1. return 0;

来返回0出去。
很多旧的基于Windows的C编译器来写的书还在用void main(),这是无法接受的。main()的返回值是有意义的,如果返回的不是0,就表示程序运行过程中错误了,那么服务器上的判题程序也会给出错误的结论。
另外,某些IDE需要在main()的最后加上一句:

  1. system("pause");

  1. getch();

来形成暂停。在上传代码到PTA的时候一定要把这句删了,要不然会得到一个超时错误。
(2) 多余的输出问题
错误的例子:

  1. int main()
  2. {
  3. int a, b;
  4. printf("请输入两个整数:");
  5. scanf("%d %d", &a, &b);
  6. ...
  7. printf("%d和%d的最大公约数是%d\n", a, b, c);
  8. return 0;
  9. }

程序中不要有任何用户友好性的提示等的输出,只能严格按照题目中所规定的输出格式的要求来输出。
你可以运行自己的程序,用题目中的输入样例来输入,如果得到的输出和输出样例完全相同,一个字符也不多,一个字符也不少,那么这样的格式就是对的。
(3) 汉字问题
程序中不要出现任何汉字,即使在注释中也不行。服务器上使用的文字编码未必和你的电脑上的相同,你认为无害的汉字会被编译器认为是各种奇怪的东西。
(4) 输出格式问题
仔细阅读题目中对于输出格式的要求。因为在服务器上程序是严格地按照预设的输出来比对你的程序的输出。
常见的输出格式问题包括:

  • 行末要求不带空格(或带空格)
  • 输出要求分行(或不分行)
  • 有空格没空格要看仔细
  • 输出中的标点符号要看清楚,尤其是绝对不能用中文全角的标点符号,另外单引号“’”和一撇“`”要分清楚
  • 当输出浮点数时,通常题目中会做适当处理,要求比较明确的输出格式,一定要严格遵守,因为浮点数会涉及到输出的精度问题
  • 当输出浮点数时,如果可能输出0,而数据可能为负时,有可能出现输出-0.0的情况,需要自己写代码判断,保证不出现-0.0

(5) 不能用的库函数
某些库函数因为存在安全隐患是不能用的,目前主要常见的是itoagets
(6) 过时的写法问题
某些旧书上的过时写法也会在服务器的gcc编译时引起错误,例如:

  1. int f( )
  2. int a;
  3. {
  4. }