常见问题及解答

如果您在使用过程中发现什么问题或者有什么建议,请点击这儿告诉管理员。

View English version of F.A.Q



Q: Online Judge(以下简称OJ)支持哪些语言?
A: 目前为止,HDOJ支持C、C++、Pascal和Java四种语言。



Q: 有什么条件判断我的程序是在OJ上运行吗?
A: 您可以使用ONLINE_JUDGE这个条件定义。下面是使用举例:

C/C++

#ifdef ONLINE_JUDGE
此间的语句只有在OJ上的才会被编译
#endif

Pascal

{$IFDEF ONLINE_JUDGE}
此间的语句只有在OJ上的才会被编译
{$ENDIF}



Q: 在OJ上我能使用哪些输入输出?
A: HDOJ上只能使用标准输入输出,您的程序不允许操作文件,否则将被判为'Runtime Error'或者'Wrong Answer'。
比如要通过1000这个题目,您可以使用以下几种形式的程序:

C++ 代码:

#include <iostream>
using namespace std;
int main()
{
   int i, j;
   while(cin >> i >> j)
      cout << i + j << endl;
  return 0;
}


C 代码:

#include <stdio.h>
int main()
{
   int i, j;
   while(scanf("%d%d", &i, &j) == 2)
      printf("%d\n", i + j);
   return 0;
}


Pascal 代码:

PROGRAM p1000(intput, output);
VAR i, j : INTEGER;
BEGIN
   WHILE NOT EOF(input) DO
   BEGIN
      Readln(i, j);
      Writeln(i + j);
   END;
END.


Java 代码:

import java.util.*;
class Sum
{
    public static void main(String args[])
    {
        Scanner cin = new Scanner(System.in);
        int a, b;

        while(cin.hasNextInt())
        {
            a = cin.nextInt();
            b = cin.nextInt();
            System.out.println(a + b);
        }
    }
}

或者

import java.util.*;
public class Main
{
    public static void main(String args[])
    {
        Scanner cin = new Scanner(System.in);
        int a, b;

        while(cin.hasNextInt())
        {
            a = cin.nextInt();
            b = cin.nextInt();
            System.out.println(a + b);
        }
    }
}

关于Java的特别说明:
1、HDOJ上使用的是JDK 1.50 Update 8多国语言版。
2、您提交的Java程序必须是单个文件的,也就是所有的类必须写在一个文件里。但是必须有一个类的里面必须包含一个名字为'main'的静态方法(函数),这个方法是程序的入口。
3、如果您将主类申明为public公有类,则这个类名必须是'Main'(注意大小写,请参看第二个程序)。
4、每个题目对于Java程序的时间和内存限制一般都会放宽的。但是即便如此,有些题目还是不适合用Java来解,对于这些题目我们建议您使用编译性语言来解。



Q: 我提交了程序,OJ回复的那些评判结果是什么意思?
A: 下面是常见的OJ评判结果以及它们表示的意思:

Queuing : 提交太多了,OJ无法在第一时间给所有提交以评判结果,后面提交的程序将暂时处于排队状态等待OJ的评判。不过这个过程一般不会很长。

Compiling : 您提交的代码正在被编译。

Running : 您的程序正在OJ上运行。

Judging : OJ正在检查您程序的输出是否正确。

Accepted (AC) : 您的程序是正确的,恭喜!

Presentation Error (PE) : 虽然您的程序貌似输出了正确的结果,但是这个结果的格式有点问题。请检查程序的输出是否多了或者少了空格(' ')、制表符('\t')或者换行符('\n')。

Wrong Answer (WA) : 输出结果错,这个一般认为是算法有问题。

Runtime Error (RE) : 运行时错误,这个一般是程序在运行期间执行了非法的操作造成的。以下列出常见的错误类型:

  • ACCESS_VIOLATION 您的程序想从一些非法的地址空间读取或向其中写入内容。一般例如指针、数组下标越界都会造成这个错误的。
  • ARRAY_BOUNDS_EXCEEDED 您的程序试图访问一个超出硬件支持范围的数组单元。
  • FLOAT_DENORMAL_OPERAND 进行了一个非正常的浮点操作。一般是由于一个非正常的浮点数参与了浮点操作所引起的,比如这个数的浮点格式不正确。
  • FLOAT_DIVIDE_BY_ZERO 浮点数除法出现除数为零的异常。
  • FLOAT_OVERFLOW 浮点溢出。要表示的数太大,超出了浮点数的表示范围。
  • FLOAT_UNDERFLOW 浮点下溢。要表示的数太小,超出了浮点数的表示范围。
  • INTEGER_DIVIDE_BY_ZERO 在进行整数除法的时候出现了除数为零的异常。
  • INTEGER_OVERFLOW 整数溢出。要表示的数值太大,超出了整数变量的范围。
  • STACK_OVERFLOW 栈溢出。一般是由于无限递归或者在函数里使用了太大的数组变量的原因。
  • ...... 其他错误,包括C++标准库/STL运行时库错误等,这里不再举例。

Time Limit Exceeded (TLE) : 您的程序运行的时间已经超出了这个题目的时间限制。

Memory Limit Exceeded (MLE) : 您的程序运行的内存已经超出了这个题目的内存限制。

Output Limit Exceeded (OLE) : 您的程序输出内容太多,超过了这个题目的输出限制。

Compilation Error (CE) : 您的程序语法有问题,编译器无法编译。具体的出错信息可以点击链接察看。

System Error (SE) : OJ内部出现错误。由于我们的OJ可能存在一些小问题,所以出现这个信息请原谅,同时请及时与管理员联系。

Out Of Contest Time : 超出比赛时间,这个信息只有在比赛的时候才会出现。



Q: 为什么我的程序在VC++/VC下能正常编译,但是使用G++/GCC就会出现'Compilation Error'?
A: GCC/G++和VC/VC++有所不同,例如:

  • 在G++/GCC下'main'函数必须定义成int型,定义成void main会得到'Compilation Error'。
  • 循环变量i定义在for语句块之内"for(int i=0...){...}"也会出错。
  • 在G++/GCC中itoa不是一个ANSI函数,但是在VC/VC++中是的。


Q: 我想参加OJ的在线比赛,如何参加比赛呢?
A: HDOJ和其他OJ不同。在HDOJ上有两种类型的比赛:一种是public公开比赛,另外一种是private内部比赛。所有HDOJ注册用户均可以参加公开的比赛,但是一般只有授权用户才可以参加内部比赛(一般是杭电的学生和受邀请的外校用户)。
要参加公开比赛,您只要进入比赛页面,找到您要提交的题目,用您的HDOJ账号直接提交就行了。
参加内部比赛的用户将会在比赛前收到比赛组织者提供的账户和密码,您用这个账户和密码才能提交。



Q: 我已经在主页上的"User Login"中登录了,但是为什么我还是不能参加比赛呢?
A: 这种情况一般只会出现在内部比赛中。您登录的那个是HDOJ的练习账号,不是那场比赛的账号。当系统就那场内部比赛要求您进行身份认证时,请输入正确的比赛账号和密码登录就行了。
注意:浏览器所有HDOJ相关页面被关闭或者您长期(一般是20分钟)处于未操作状态的时候,您的所有认证将失效,这时您只要重新登录就行了。



Q: 为什么我用scanf/printf的组合能得到'AC'的程序换成cin/cout就得到了'TLE'?
A: 一般情况下,C语言运行时I/O函数比C++的效率高一些,所以处理大数据量的时候,建议使用scanf/printf组合。



Q: 我用Borland C++ 3.1或者Borland Pascal 7.0写程序的,那么我如何才能避免得到'Compilation Error'?
A: 我们服务器上使用的是Borland Delphi 7编译器。您需要注意以下几个方面:
  • 您的程序可以使用超过64K大小的数组。
  • 不要使用Pascal语言基于Dos操作系统的CRT单元和C/C++的conio.h头文件。
  • 对于Pascal integer = longint,对于C/C++ int = long。
  • 用GCC/G++提交的话,来自math.h申明的函数不能使用整数作为参数。像sqrt(2)的调用会得到错误,您要写成((double)2)或者sqrt(2.0)。
  • 在GCC/G++中,函数j0,j1,jn,y0,y1,yn已经在math.h中被定义。所以,当您使用math.h的时候,要避免为全局变量取这些名字。
  • Pascal编译器默认string类型(后面不加大小限制)为AnsiString类型,它将可以是任意长度的字符串(至于其他字符串类型ShortString、WideString,请参看Delphi 7的SDK)。要得到字符串的长度,可以使用length函数。
  • Pascal中,与函数名相同的变量有特殊的意义,它表示这个函数的返回值,以下两个函数是等价的:

    function Sum(a, b: integer): integer;
    begin
       Sum := a + b;
    end;

    function Sum(a, b: integer): integer;
    begin
       result := a + b;
    end;


  • 以下列出的是Pascal/Delphi的所有保留字:
    as
    and
    begin
    constructor
    do
    except
    finally
    if
    initialization
    label
    not
    out
    property
    resourcestring
    string
    try
    uses
    false
    array
    case
    destructor
    downto
    exports
    for
    implementation
    inline
    library
    object
    packed
    raise
    set
    then
    type
    var
    new
    as
    class
    dispinterface
    else
    file
    function
    in
    interface
    mod
    of
    procedure
    record
    shl
    threadvar
    unit
    while
    new
    asm
    const
    div
    end
    finalization
    goto
    inherited
    is
    nil
    or
    program
    repeat
    shr
    to
    until
    with


Q: 如何使用64位整数类型?
A: 服务器支持64位有符号和无符号类型的整数。
  • 有符号型64位整数,值域为:-9223372036854775808 .. 9223372036854775807。

    语言 GNU C/C++ Pascal Visual C/C++
    类型名称 __int64
    or
    long long
    int64 __int64
    输入方法 scanf("%I64d", &x);
    or
    cin >> x;
    read(x); scanf("%I64d", &x);
    输出方法 printf("%I64d", x);

    cout << x;
    write(x); printf("%I64d", x);

  • 无符号型64位整数,值域为:0 .. 18446744073709551615。

    语言 GNU C/C++ Pascal Visual C/C++
    类型名称 unsigned __int64
    or
    unsigned long long
    qword unsigned __int64
    输入方法 scanf("%I64u", &x);
    or
    cin >> x;
    read(x); scanf("%I64u", &x);
    输出方法 printf("%I64u", x);
    or
    cout << x;
    write(x); printf("%I64u", x);