PKU JudgeOnline FAQ 中文版
--oyjpArt
常見問題解答
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,我該怎么優化程序呢?
11. 我還有其他問題?
________________________________________
問題: 我的程序如何進行輸入輸出?
解答: 你的程序應該始終使用標準輸入(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(超時).
________________________________________
問題: 在線判題系統的編譯器是哪些?
解答: 目前我們使用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);
}
}
________________________________________
問題: 提交的時候可否使用快捷鍵?
解答: 以下是提交頁面的快捷鍵
ALT+s 提交
ALT+u 用戶名域(如果你還沒有登陸)
ALT+l 編譯語言選項
ALT+p 提交的題目ID號
________________________________________
問題: 請問提交的程序是如果被判答的?
解答: 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將會判答.
________________________________________
問題: 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,請盡快通知管理員.(當然,這也意味著你的程序很可能是錯誤的).
________________________________________
問題: Special Judge的題目有什么不同?
解答: 但一個題目可以接受多種正確答案,即有多組解的時候,題目就必須被Special Judge.
Special Judge程序使用輸入數據和一些其他信息來判答你程序的輸出,并將判答結果返回.
________________________________________
問題: 如何確定程序讀入的終止?
解答: 大部分情況下,題目會在input中清晰地描敘輸入數據如何結束,比如,test cases的數目或者一
行全零的數據,等等.但是,有時候你必須用EOF結束符來確認文件的結尾.在這種情況下,你必須檢查
scanf的返回值(返回有多少個值被成功的讀入或者為0時返回EOF),對于cin,則可以類似的通過 !cin來
確認.你可以參考Problem 1001的Hint進一步了解如果確定程序讀入的終止.
________________________________________
問題: 為什么我的程序在GCC/G++ (C/C++)下被判成WA/TLE/RE,但是在C/C++ (GCC/G++)下被判成AC?
解答: 很可能是因為你的程序里的一些微小錯誤在不同編譯器的因素下導致的不同判答。我們建議您仔
細檢查您的代碼以找到錯誤。另外一個可能的原因就是不同的編譯器往往使用不用的函數,庫,和設置
來生成可執行文件。所以在特殊情況下,有可能不同編譯器下生成的可執行程序會有不同的執行效率或
者執行結果。比如,MS-VC++的棧的大小比在G++下的棧要大。一個具有很深的遞歸的程序就可能出現暴
棧的情況。如果你很肯定地認為你的程序在不同編譯器下判答的差異是由編譯器造成的,請聯系我們。
________________________________________
問題: 有些題目的時間限制是1秒,但是有些程序卻以幾秒的時間AC了?
解答: 大部分這樣的程序是Java程序。眾所周知,Java程序的運行速度比C/C++程序要慢很多。所以對于
Java程序的時間限制也要長于普通時限。確切的說,Java程序允許運行的運行時限是普通時限的3倍。而
且給于150MS的多于時間作為I/O速度慢的補償。如果你的程序不滿足上述條件,請聯系我們。
________________________________________
問題: 我的程序僅僅超過時間限制15MS,我該怎么優化程序呢?
解答: 大部分情況下,你的程序實際上需要比時限多較多的時間來運行。POJ會在題目的時限到達的時候
自動終止你的程序。通常超時的程序會顯示超過時限15MS。一般的優化程序技巧包括縮小算法的常數和
采用更加有效的算法。
________________________________________
問題: 我還有其他問題?
解答: 您可以充分利用我們的BBS系統來提問。請您用較和氣的口吻來提問,管理員和其他人都會盡可能
來幫助你。
All Rights Reserved 2003-2006 Ying Fuchen,Xu Pengcheng,Xie Di
Tanslated by oyjpArt
Any problem, Please Contact Administrator