- Online Judge系統
Online Judge系統(簡稱OJ)是一個在線的判題系統。用戶可以在線提交給定問題的多種程序(如C、C++、Pascal、Java)源代碼,系統對源代碼進行編譯和執行,並通過預先設計的測試數據來檢驗程序源代碼的正確性。
一個用戶提交的程序在Online Judge系統下執行時將受到比較嚴格的限制,包括運行時間限制、內存使用限制和安全限制等。用戶程序執行的結果將被Online Judge系統捕捉並保存,然后再轉交給一個裁判程序。該裁判程序或者比較用戶程序的輸出數據和標准輸出樣例的差別,或者檢驗用戶程序的輸出數據是否滿足一定的邏輯條件。最后系統返回給用戶一個狀態:通過(Accepted)、答案錯誤(Wrong Answer)、超時(Time Limit Exceed)、超過輸出限制(Output Limit Exceed)、超內存(Memory Limit Exceed)、運行時錯誤(Runtime Error)、格式錯誤(Presentation Error)、無法編譯(Compile Error),並返回程序使用的內存、運行時間等信息。在線測評系統的評判情況如表1所示。
表1 測評系統的評判結果
評判 |
縮寫 |
說明 |
Accepted |
AC |
程序通過了所有的測試點,被判為正確 |
Presentation Error |
PE |
程序的輸出結果是正確的,但是格式不符 |
Time Limit Exceeded |
TLE |
程序運行超過了限定的時間,可能是超過總時間限定,也可能是超過單個測試點時間限制 |
Memory Limit Exceeded |
MLE |
程序運行超過了所需的內存限制 |
Wrong Answer |
WA |
程序的輸出結果不對 |
Runtime Error |
RE |
程序在運行時產生了無法處理的異常 |
Output Limit Exceeded |
OLE |
程序產生了多余的輸出 |
Compile Error |
CE |
程序無法通過編譯 |
System Error |
|
在線測評平台無法運行該程序 |
Validator Error |
|
檢驗程序在校驗輸出結果時出現異常 |
Online Judge系統最初使用於ACM-ICPC國際大學生程序設計競賽和OI信息學奧林匹克競賽中的自動判題和排名。現廣泛應用於世界各地高校學生程序設計的訓練、參賽隊員的訓練和選拔、各種程序設計競賽以及數據結構和算法的學習和作業的自動提交判斷中。
國內較好的在線測評系統有:
北京大學的PKU JudgeOnline(http://poj.org/ )
浙江大學ACM在線測試(http://acm.zju.edu.cn/onlinejudge/ )
杭州電子科技大學的HDU Online Judge System (http://acm.hdu.edu.cn/)
-
PKU JudgeOnline在線測評系統
在亞洲,北京大學的PKU JudgeOnline在線測評系統是規模最大、品質最高的在線測評系統。在IE瀏覽器的地址欄輸入http://poj.org/,打開PKU JudgeOnline網站,出現如圖1所示的主頁。
圖2-1 PKU JudgeOnline主頁
在PKU JudgeOnline網站中,提供了4千多道題目。用戶可以在該網站中注冊一個用戶ID,然后選擇某個問題進行求解。用戶可以將編寫的程序通過網頁提交給在線測評系統,每一次提交后,測評系統都會將評判結果顯示在網頁上。
用戶可以根據測評系統反饋回來的評判結果修改程序,直到最終收獲Accepted。這個過程不僅能培養用戶獨立分析問題、解決問題的能力,而且每成功解決一個問題都能給用戶帶來極大的成就感。
在PKU JudgeOnline主頁單擊超鏈接“Problems”,可打開如圖2所示的頁面。在頁面中用列表的形式顯示了系統中提供的各個問題,例如,頁面中顯示的“1000、A+B Problem、 56%(271151/480509)、2019-6-10,表示ID號為“1000”的題目“A+B Problem”截止到2019年6月10日,有480509人次提交了程序,其中有271151次通過。
圖2 Problems 列表
在列表中可以選定某個問題,單擊Title下的超鏈接,可以打開對應問題的頁面。例如,單擊ID號為2590的問題“Steps”超鏈接,或者在“Prob ID:”文本框中輸入“2590”,單擊“Go”按鈕,可以打開如圖3所示的頁面。
圖3 題目“Steps”的描述信息
這道題目的意思是:給出在數軸上的兩個整點x、y(0<=x、y<2^31),問從x移動到y至少需要幾步?移動時要求:(1)每一步可以比上一步長1、短1或相等;(2)第一步和最后一步必須是1。
- 編程思路
輸入數軸上的兩個點from和to后,需要移動的距離就確定了distance=to-from。由於移動時,第一步和最后一步必須是1,且每一步與上一步相差不超過1。因此最快的移動方式應該為從1開始遞增(每次加1)移動到中點附近,然后遞減(每次減1)移動到終點。由於遞增和遞減的兩個過程可以基本看成是對稱的,因此設置一個變量cnt來記錄每次移動的步數,初始值為0。移動時,從總距離distance上減去遞增過程中的cnt和遞減過程中的cnt,直到distance不再大於0。
例如,從10移動到19,需要移動的情況為:distance=19-10=9。
9-1(第1步)=8-1(最后1步)=7>0
7-2(第2步)=5-2(倒數第2步)=3>0
3-3(第3步)=0 結束。
- 源程序
#include <iostream>
using namespace std;
int main()
{
int n,from,to,distance,cnt,ans;
cin>>n;
while(n--)
{
cin>>from>>to;
distance = to - from;
cnt = ans = 0;;
while(distance > 0)
{
distance -= ++cnt;
++ans;
if(distance > 0)
{
distance -= cnt;
++ans;
}
}
cout<<ans<<endl;
}
return 0;
}
在寫出了該問題的程序后,可以將其提交給測評系統評判。單擊主頁中的“Submit Problem”超鏈接,打開如圖4所示的提交頁面。在“Problem ID”后的文本框中輸入“2590”,在“Language”下拉列表框中選擇語言為“C++”,在“Source”多行文本框中輸入所編寫的程序,單擊“Submit”按鈕,即可將程序提交給測評系統。之后,測評系統會打開一個頁面顯示評判后的結果。
圖4 程序提交頁面
PKU JudgeOnline作為一個優秀的開放式程序在線評測平台,值得程序設計愛好者好好利用。特別是計算機類專業的學生,可以充分利用自己的課余時間和上機實驗課時間,隨時上網做題,一旦提交答案,馬上可以知道對錯,從而極大地調動學習的積極性和主動性,大大提高實際的編程能力。