Monday, November 12, 2007

什麼是 ACM Onlinejudge 以及如何註冊 ?

ACM是 Association for Computing Machinery 的縮寫,是世界上研究電腦科學的一個組織。而ACM Online Judge System 是由西班牙的一所大學維護,他裡面收集了許多歷年來ACM程式比賽的題目,讓有興趣的人去解題,藉由一些測試資料來判斷寫的程式正不正確,當然定期也有一些線上比賽可以參加。

為什麼要寫ACM呢?有些人常常會幻想說,我要寫遊戲!我要當駭客!我要成為海賊王之類的夢想。但是,夢想沒有努力去做,充其量也是幻想。這就像小鳥不會跳就想學飛是一樣的。有人會覺得寫這些題目沒什麼,很無聊、題目是英文看不懂,但是卻不知道這是訓練一個人用電腦解決問題的能力的方法,是一種磨練。

三分鐘熱度的人很多,會持續去寫的人很少。但是實際寫一陣子以後,不用說很強,也自然會發現學校的作業似乎不是這麼的難。又可以練習到資料結構、演算法、離散數學的能力。

講了這麼多,要開始之前,先好好想一想到底你真正想要的是什麼。不然也不必花時間註冊帳號,浪費自己的時間也浪費網路資源。

首先,開啟http://uva.onlinejudge.org/



按下左方的Register,進入註冊畫面。



依序填入相關資訊(名稱、密碼,希望大家註冊時能夠加上NCCUCS的字樣),值得注意的是E-Mail請填一個平常會去看信的信箱,Online-Judge ID則是如果之前已經註冊過舊版的ACM帳號,就把之前的五碼數字加上兩碼英文填入,可以做資料的轉移。如果是新手則填入五個零00000,最後一個選項是選擇是否把解題的結果送到信箱。一切完成以後就可以按下Send Registration了。

完成之後就可以到你的信箱裡面收信,信裡面有個又臭又長的連結按下去,就可以成功啟用這個帳號了。

接下來將說明如何送出題目。首先我們先回到一開始的首頁從左邊登入自己的帳號密碼以後,會看到如下的畫面:

在Browse Problems上面按下去之後,右邊會出現兩個資料夾:Problem Set Volumes跟Contest Volumes。前者代表的是原本網站上面的題庫,編號是100~999;而後者則是歷年ACM比賽下來的題庫考古題,編號都是五位數的數字。



舉例來說,我現在要寫史上最簡單的題目10071,所以我會去Contest Volumes底下的Volume C找到10071 - Back to High School Physics (這邊資料夾是用羅馬數字來分類的,每一百題一個資料夾)。同時題目右邊的兩個百分比則代表了所有送出的CODE裡面有多少%是成功解出來的所有使用者裡面有多少%成功解出這題。由此可以知道此題的難易度如何。

現在點進去看題目,題目一開始扯了許多東西,像是一個粒子經過一段時間的加速會從初速V0跑到V的速度,題目問,如果一個粒子以V的速度跑了兩倍T的時間,位移是多少?夠簡單吧!

看題目時,要注意他規定的INPUT跟OUTPUT格式。以這題來說INPUT每行都是一組測試資料,分別是兩個數字代表V跟T(題目有給V和T的範圍),而OUTPUT則是一行代表一個結果,只要輸出數字就好,其他的文字都不必要輸出。像是什麼無關緊要的字串如:The Result is .... etc都不用,只要輸出題目要的東西即可。他會給一些SAMPLE的INPUT跟OUTPUT可以參考,但是可別以為這些對就會成功。因為其實有時候很多邏輯沒考慮到,而她給的SAMPLE也沒講出來,那麼貿然送出就可能會得到WA了。還有,所有的題目都是標準輸出輸入,所以不會用到讀檔的問題。

題目上方有三個按鈕分別是:送出、下載電子板的題目、跟這一題的統計資料(如:解出的人花的CPU TIME跟記憶體等等),假設現在我們寫好了就可以按下送出。



按下送出後會看到一個新的頁面,上面可以選擇用的程式語言(C、C++、JAVA、PASCAL,注意這些語言所使用的版本,像是C就是只能用ANSI C),選好以後可以在中間貼上CODE或者是從下面上傳檔案。當一切準備好,就可以按下送出了。


送出以後會跳到原本題目的頁面,不過上面會出現一個紅底的字樣寫著這次送出的編號。


記起來這個編號以後,可以點左邊的My Submissions去觀看結果。果然點下去以後,看到了這個編號送出的結果是Accepted,代表我們這題寫的是正確的,完全通過所有測試資料的結果。



一般來說,看到的結果會有下面這些:

Accepted(AC): 代表完全正確,格式也正確。
Presentation Error(PE): 結果正確,但是呈現的格式錯誤,ACM網站上面會算有解出這題,但正式比賽就不是了。
Wrong Answer(WA): 至少有一組的結果是錯誤的,但不會跟你說哪裡錯。
Runtime Error(RE): 執行階段錯誤,像是可能除以零。
Time Limit Exceed(TLE): 超過執行時間,一般來說每一題都是給十秒跑完所有測資,但是有些題目會指定時間。
Memory Limit Exceed(MLE): 同上,記憶體用太多了。
Output Limit Exceed(OLE): 輸出資料過多。
Compile Error(CE): 這更慘,COMPILE沒過,會把編譯器的錯誤訊息寄回信箱。
Restricted Function(RF): 使用一些禁制的函數,像是system()、檔案有關的函數等等。
Other: 其他種類錯誤。

簡單來說,看到Accepted就是成功解題的象徵。

ACM訓練的不只是分析題目,更考驗了邏輯、和許多數學的能力。慢慢的寫,從簡單開始到難題,實力是可以慢慢累積起來的。有興趣可以三五好友組成讀書會一起加油。

===============================================

附上10071的參考CODE:

#include <stdio.h>

int main(){
int v,t;
while(scanf("%d %d",&v,&t)==2){
printf("%d\n",2*v*t);
}
return 0;
}

0 意見: