您的位置:首页 > 其它

PKU JudgeOnline FAQ 中文版 【ACM判题系统常见问题】

2013-05-28 12:48 513 查看

PKU JudgeOnline FAQ
中文版【ACM判题系统常见问题】

PKU JudgeOnline FAQ
中文版 

常见问题解答
1. 我的程序如何进行输入输出?

2. 在线判题系统(以下简称POJ)的编译器是哪些?

3. 提交的时候可否使用快捷键?

4. 请问提交的程序是如果被判答的?

5. POJ对提交程序的不同判答的意义?

6. Special Judge的题目有什么不同?

7. 如何确定程序读入的终止?

8. 为什么我的程序在GCC/G++ (C/C++)下被判成WA/TLE/RE,但是在C/C++
(GCC/G++)下被判成AC?

9. 有些题目的时间限制是1秒,但是有些程序却以几秒的时间AC了?

10. 我的程序仅仅超过时间限制15MS,我该怎么优化程序呢?

________________________________________

1.问题:
我的程序如何进行输入输出?

解答:
你的程序应该始终使用标准输入(stdin)和标准输出(stdout).比如,你可以使用scanf(在C/C++编译器下)或者cin(在C++编译器下)来读取数据,使用printf(在C/C++编译器下)或者cout(在C++编译器下)来输出答案.用户提交的程序将不允许读/写文件操作.如果你坚持要这样做,OJ很可能会返回Runtime Error(运行时错误)或者Wrong
Answer(答案错误).
另外还要注意的是在C++下的I/O操作.由于其复杂的内部实现方式,cin和cout相对于scanf和printf来说要慢上不少.如果在G++下编译提交,速度的差异将会愈加明显.所以如果题目给出的数据将有巨大的输入数据时,使用cin和cout有可能导致意外的Time
Limit Exceed(超时).

________________________________________

2.问题:
在线判题系统的编译器是哪些?

解答:
目前我们使用5个编译器来支持各种语言的程序提交.C和C++采用的是MS-VC++
6.0,而对于GCC/G++,采用的是MinGW+GCC/G++ 3.4.2.
对于Pascal,
采用的是FreePascal 2.0.0.
对于Java,
采用的是JDK 1.5.0.
下面是1000的正确程序在不同编译器下的写法:

C and GCC:

#include <stdio.h>
 int main(void)

{

int a, b;

scanf("%d %d", &a, &b);

printf("%d\n", a + b);

return 0;

}
 C++ and G++:

#include <iostream>

using namespace std; 
int main(void)

{

int a, b;

cin >> a >> b;

cout << a + b << endl;

return 0;

}
 
使用GCC/G++的提醒:
对于64位整数, long long int
和 __int64
都是支持并且等价的.但是在读和写的时候只支持scanf("%I64d", ...)和printf("%I64d",
...).不支持"%lld"是因为MinGW下的GCC和G++使用的msvcrt.dll动态链接库并不支持C99标准.根据ISO
C++标准,在G++下,main函数的返回值必须是int,否则将会导致Compile
Error(编译错误)的判答.
 
Pascal:

Program p1000(Input, Output); 

Var 

a, b: Integer; 
  
Begin

Readln(a, b); 

Writeln(a + b); 

End.
 
Java: 

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程序的提交必须使用单个源文件.除了要遵守其他程序提交的规则之外,使用Java提交的程序还必须

从一个静态的main方法开始执行,并让该main方法置于一个名为Main的类中,否则将会导致Compile 

Error(编译错误)的判答.遵守了上述规则的情况下,你可以实现和初始化任意需要的类.
在JDK 1.4下的一个标准程序如下:

import java.io.*;

import java.util.*;

public class Main

{

public static void main (String args[]) throws Exception

{

BufferedReader stdin = 

new BufferedReader(

new InputStreamReader(System.in));

String line = stdin.readLine();

StringTokenizer st = new StringTokenizer(line);

int a = Integer.parseInt(st.nextToken());

int b = Integer.parseInt(st.nextToken());

System.out.println(a + b);

}

}
 
________________________________________

3.问题:
提交的时候可否使用快捷键?

解答:
以下是提交页面的快捷键
ALT+s 提交
ALT+u 用户名域(如果你还没有登陆)

ALT+l 编译语言选项
ALT+p 提交的题目ID号
________________________________________

4.问题:
请问提交的程序是如果被判答的?

解答: POJ首先将你提交的程序存为文件,然后试图按照你选择的编译语言进行编译.如果编译出现错误,将会判答Compile
Error.然后POJ运行您的程序,将输入数据送入程序,并且开始计时(记录程序的运行时间).输入数据储存在一个或多个输入文件中.每一个文件都会用来判定你的程序并且只使用一次.在程序执行过程中,如果POJ发现你的程序的运行状态符合Runtime
Error, Time Limit Exceed, Memory Limit Exceed或者Output Limit Exceed的标准,这些判答就会返回并结束.这意味着在TLE或者MLE的情况下,不能确定程序是否能在充裕的硬件和时间条件下得到正确的结果.当你的程序跑完一个输入文件时,POJ将会对你的输出文件和相应标准输出文件进行比较,或者在Speical
Judge的题目时进行Special Judge.如果输出是不正确的且不满足Presentation Error,将会给与Wrong
Answer判答并结束.否则POJ将会继续进行下一个输入文件的运行和处理.如果所有的输入文件都已结束,如果整个过程中没有遇到上述的6种错误但是输出的符合Presentation
Error的条件,将会给与Presentation Error的判答并结束.否则,恭喜您,Accepted将会判答.

________________________________________

5.问题: POJ对提交程序的不同判答的意义?
解答:
下面是POJ所有的判答结果,缩写,和准确含义
Waiting:你的程序正在被判答或者在等待判答.
 
Accepted (AC):
恭喜!您顺利通过了本题的所有测试数据!
 
Presentation Error (PE):
你的程序的输出格式和题目所要求的不是完全一致,但是输出的数据是正确的.这一般是白字符(空格,tab和/或换行等白字符)的缺少或者多余或者空行的缺少多余所导致的.每行的结尾的空格和输出的末尾空行不会被判成PE.请仔细检查输出的空格,空行等是否与要求的输出完全一致.

Wrong Answer (WA):你的程序没有输出正确的答案。为了简化判答,如果是Secial Judge的题目,本该判Presentation
Error的程序也可能返回Wrong Answer.
 
Runtime Error (RE):你的程序在执行过程中崩溃了.
可能的原因包括:非法文件访问,栈溢出,数组越界,浮点异常,除零运算等等.
程序长时间不响应也可能被认为是发生了Runtime Error.
 
Time Limit Exceed (TLE):你的程序运行的总时间超过了时间限制.每个题目有2个时间限制,即TOTAL TIME
LIMIT(总运行时间限制)和 CASE TIME LIMIT(一次运行时间限制)
.前者是你的程序运行所有的输入文件数据的总时间限制,后者则是运行单个数据输入文件的限制.
两者之中只要有一个超时,就会导致判答Time Limit Exceed.
如果你的程序被判答Time Limit Exceed,但是并没有超过总运行时间限制,那就说明你的程序超过了一次运行时间限制.如果题目没有特殊说明CASE
TIME LIMIT,
那么将默认设置为与TOTAL TIME LIMIT相同的值,并且不会在题目中显示出来.

Memory Limit Exceed (MLE): 你的程序使用的最大内存超过了内存限制.
 
Output Limit Exceed (OLE):
你的程序的输出超过了文本输出大小限制.目前文本输出大小限制被设置为标准输出大小的2倍.最主要的原因是你的程序在包含输出的语句中陷入了无限循环的错误.

Compile Error (CE): 编译器在编译你的程序的时候发生了错误.警告信息不会被认为是错误.单击POJ对你的程序的判答结果,可以看到编译器产生的错误和警告信息.
 
No such problem:你提交的程序不存在或者不可用.
 
System Error:你的程序无法运行.举例:你的程序需要比当前硬件条件下的内存多得多的空间.
 
Validate Error: Speical Judge程序无法正确检验你的输出文件.
可能是Special Judge程序有错.如果你的程序被判答Validate Error,请尽快通知管理员.(当然,这也意味着你的程序很可能是错误的).

________________________________________

6.问题: Special Judge的题目有什么不同?
解答:
但一个题目可以接受多种正确答案,即有多组解的时候,题目就必须被Special Judge.
Special Judge程序使用输入数据和一些其他信息来判答你程序的输出,并将判答结果返回.

________________________________________

7.问题:
如何确定程序读入的终止?

解答:
大部分情况下,题目会在input中清晰地描叙输入数据如何结束,比如,test cases的数目或者一行全零的数据,等等.但是,有时候你必须用EOF结束符来确认文件的结尾.在这种情况下,你必须检查scanf的返回值(返回有多少个值被成功的读入或者为0时返回EOF),对于cin,则可以类似的通过 !cin来确认.你可以参考Problem
1001的Hint进一步了解如果确定程序读入的终止.
________________________________________

8.问题:
为什么我的程序在GCC/G++ (C/C++)下被判成WA/TLE/RE,但是在C/C++ (GCC/G++)下被判成AC?
解答:
很可能是因为你的程序里的一些微小错误在不同编译器的因素下导致的不同判答。我们建议您仔细检查您的代码以找到错误。另外一个可能的原因就是不同的编译器往往使用不用的函数,库,和设置来生成可执行文件。所以在特殊情况下,有可能不同编译器下生成的可执行程序会有不同的执行效率或者执行结果。比如,MS-VC++的栈的大小比在G++下的栈要大。一个具有很深的递归的程序就可能出现暴栈的情况。如果你很肯定地认为你的程序在不同编译器下判答的差异是由编译器造成的,请联系我们。
________________________________________

9.问题:
有些题目的时间限制是1秒,但是有些程序却以几秒的时间AC了?

解答:
大部分这样的程序是Java程序。众所周知,Java程序的运行速度比C/C++程序要慢很多。所以对于Java程序的时间限制也要长于普通时限。确切的说,Java程序允许运行的运行时限是普通时限的3倍。而且给于150MS的多于时间作为I/O速度慢的补偿。如果你的程序不满足上述条件,请联系我们。 
________________________________________

10.问题:
我的程序仅仅超过时间限制15MS,我该怎么优化程序呢?

解答:
大部分情况下,你的程序实际上需要比时限多较多的时间来运行。POJ会在题目的时限到达的时候自动终止你的程序。通常超时的程序会显示超过时限15MS。一般的优化程序技巧包括缩小算法的常数和采用更加有效的算法。
________________________________________
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: