學到這裏,程式的基礎也差不多告一段落啦!接下來沒有太多新東西了~
什麼!?明明只學了沒幾樣語法,竟然把博大精深C語言學得差不多了!?
嘿嘿,雖然還差得遠!但基本語法差不多就這樣了!接下來就是看你能把這些運用得多好!
正所謂在家持刀空揮千百遍,不如上街實地砍他幾十人!你會發現實際沒你想的容易,人類會掙扎、會逃、會利用身邊之物反擊,甚至還會叫警察!
這些都是沒實地砍過就無法獲得的經驗,不過隨著經驗累積,你慢慢會知道如何應付各種掙扎與逃跑的手段,出手的時機以及獵物的選擇…
什麼?你說這犯法…好吧,下地城砍怪練功總不犯法了吧!相信你們都了解實際練習的重要性了!
今天就告訴你們哪兒有不錯的迷宮可供修練、事前的準備和注意事項!
修練程式技巧的聖地:線上批改系統 (Online Judge, OJ)!
系統會提供你們大量的題目,並提供大量數據,只要將程式碼上傳到網站上,系統就會自動幫你驗證程式正確與否,並告訴你執行效能好不好、和其他人比較起來如何!超方便的吧?超吸引人的吧?驗證程式正不正確並不容易,要測出效率更不容易!試想人如何分辨千萬分之一秒和百萬分之一秒,但網站都幫你做好了!
什麼?沒有興趣?好,沒關係,咱們換個角度思考。只要角度對了,很容易就可以突破…嗯,突破難關!換個角度看世界,世界就會變得更美好!
陪你修練程式技巧的好搭檔:親切的萬能大姊姊「批改娘」伴你一同體驗解題的樂趣!
批改娘將無私地提供大量的題目供你練習,過程還會全程陪伴你左右、不計辛勞地幫你批改程式,為你做大量測試來分析效能與驗證正確性,協助你邁向更高的境界!
如何?變得超想大顯身手了吧!
廢話不多說,先從最廣為人知的狩獵場開始:
UVa Online Judge http://uva.onlinejudge.org
在台灣又稱作ACM,是個只有台灣人聽得懂的暱稱。因為以前這裡有ACM ICPC的考古題,就被稱作是ACM,解這裏的練習題被稱作寫ACM。
目前幾乎是最廣為人知、使用者也最多的線上批改系統。有相當多程式解題競賽的考古題,也時常舉辦各式各樣的線上賽,題型廣泛、簡單題數量也夠,適合入門!
什麼是程式解題呢?就是訓練你具備「用程式解決問題」的能力。你必須能夠快速而正確地寫出夠有效率的程式,對於給予的數據都能計算出預期的結果。
你不需要管「正確有效率地計算」以外的任何問題,包括要不要顯示萌圖、操作起來流不流暢、要不要搭配3D演示計算過程…等等等。
算是比較枯燥的基本功,但基本功一紮實練什麼都快!
說再多也不如實際做上幾道題,就讓我們先註冊個帳號!
首先首頁左邊有個登入欄,下面有個「No account yet? Register」,往紅紅的地方給他點下去!
之後由上往下分別是:
名字 (建議不要用中文,雖然很多人用;這會顯示在排行榜上面)
電子郵件信箱 (需要收註冊信開通帳號)
帳號 (登入用)
密碼
再一次密碼
舊網站的ID (理論上約2005左右還沒接觸過程式解題的話應該不會有,填00000就好)
是否將解題結果寄到電子郵件信箱 (建議勾選,雖然很吵,但*rejudge會有通知,方便)
*rejudge: 當官方發現數據錯誤或不夠檢驗出某些錯誤,會在更換數據後重新批改一次;若沒有用Email接收通知,很容易忽略掉重新批改的訊息。
接下來應該就完成啦!收個信點個激活帳號用連結,就沒問題了!
所以當然是先Browse Problem…WTF?截至目前已有兩三千道題,但我們可是新手,該從何著手呢!?而且題目點進去全都是英文啊啊啊啊啊啊!
沒關係,有個偉大的網站:
Lucky貓的ACM園地 http://luckycat.kshs.kh.edu.tw/
熱心的前輩們幫你們翻譯了他們覺得有意思的題目!而且列出了參考難度以及解題方向,讓入門者不至於一開始就迷失方向!
…不過偷偷說,提示解題方向其實是有好有壞的喔!而且參考難度會有個人差異,不能說不準確,但每人感覺會不一樣!
當然啦,雖然我鮮少協助翻譯 (其實我翻譯過數百題,只是都沒投稿) 不過還是在此幫忙說一聲,如果你覺得這網站有幫助到你,等你有能力時,請別忘了將你覺得必須分享的好題目,翻譯後投稿至此,造福後輩們喔!
如果你寫多了,會發現很容易重覆解到同一道題!要找自己沒寫過的題目很麻煩,不過…
之後可以搭配我自己寫的工具:
http://phantom.tfcis.org/~sa072686/lcat/
只要找出自己的uid(數字)或用帳號搜尋,就可以幫你自動過濾寫過的題目喔!方便吧~
題目少時還用不上,先記著有這東西存在就行了!
在你想練習判斷題型方向時,它也可以幫你遮蔽住提示和解題方向喔!
另外還有個方便的工具:
uHunt http://uhunt.felix-halim.net/
輸入帳號就能幫你做許多分析統計,還能幫你列出未解的題目中,最多人解出來的題目喔!通常是最簡單的,是幫助你找下一題的好幫手!
但是在有個1、200題前通常不是很準,因為有些題目出了十年了,有些剛出沒幾個月,所以和難度並不一定有相關性!不過沒關係,我也會提供你們方向,帶領你們邊解題邊學習成長的,所以不用擔心一出新手村就要屠龍弒神之類的事!
別急別急!赤手空拳脫光光背包空空就想下迷宮打怪撿寶嗎?只會給怪物練功而已啦!
接下來的冒險指南可是非常重要的喔!耐心讀完後就可以和精心栽培的使魔一同過關斬將啦!
如果記不完沒關係,可以之後碰壁再回來查。
建議大略看過就好,不用記太仔細!一次這麼多東西很難記得完,所以我會在之後的入門題題解,透過入門題讓大家慢慢熟悉環境!到時會把必要的部份解說得更加詳細!
一、先了解遊戲規則
找到想解的題目 -> 細心讀題 -> 思考解法 -> 寫成程式 -> 看清楚題號後上傳 -> AC!
找怪 -> 觀察弱點 -> 思考戰術 -> 付諸行動 -> 決鬥 -> 戰勝! 不過..傳錯可是會被批改娘笑的喔!就像情書寄錯人一樣超糗的喔!!
第一步: 找題目,初期去Lucky貓找一星題來做會比較安定,更安定的是先做我列出來的新手題。但是一定等級後必須學著自行找題目練!判斷方向和題型的能力很重要!
第二步: 讀題!必須讀得仔細,尤其是輸出輸入格式!這可是非常嚴格的,後面會提。
第三步: 思考。從判斷思考方向到確立解法並驗證正確,都屬於這階段。謀定而後動!
第四步: 將想法寫成程式。
第五步: 到批改娘主頁,左邊Quick Submit,輸入正確題號,將程式碼複製貼上,選好語言 (ANSI C),按下上傳!
第六步: 到左邊選單選My Submissions (建議Quick Submit一個分頁,My Submissions一個分頁) 觀看結果!
結果會有以下數種:
Accepted (AC): 恭喜!你的程式碼通過了批改娘細心的測試!但這不代表你的程式一定是對的。很難有方法檢驗正確與否,只能透過餵進大量數據想辦法找出你的錯誤。
所以,有可能只是恰巧沒被找出來;比如說他只有一千組數據,你卻故意讓程式在第一萬組時,輸出一定錯誤的答案。你的程式會是錯的,但批改娘檢驗不出來!
Presentation Error (PE): 現在相當少見,表示你計算正確,但輸出格式不對。批改娘的比對速度很快很精確,但是很笨。等下會特別提這件事。
Wrong Answer (WA): 你的答案和預期的不相符。
Time Limit Exceeded (TLE): 你的程式無法在預期時間內完成計算並結束。每題會有一個時限,你的程式不只要正確,還要能在限制時間內算出來!
一個沒效率的做法,很可能讓1秒內算得完的題目,跑到地球毀滅都還沒算出來,即使它能被證明會正確地算完並結束。
Runtime Error (RE): 你的程式不正常結束,通常是當掉了,比如說除以0等等。你養出來的使魔會很忠實地完成你賦予的任務,但是遇上除以0就會發現無法完成,可牠又覺得非完成不可,否則沒臉回來見主人,最後就自殺了。
所以程式當掉先別急著煩燥或發怒,想想你忠實的使魔因你的疏失無法完成任務,因而羞愧自盡了啊!
Compilation Error (CE): 批改娘會打你屁屁,你程式不只寫錯,還錯到連執行都不行!本來這沒什麼可恥,但讓批改娘判出CE表示你自己試都沒先試過就上傳了!這是相當不負責任的行為喔!
這是很基本的禮貌。先自行初步確認無誤後,再請批改娘幫你做更進一步的測試!
Output Limit Exceeded (OLE): 代表你輸出太多東西了!肯定有多餘或是哪邊出問題。
現在記不完沒關係,以後遇到再回來查也可以!
AC之後建議不要把費盡心思養好的使魔直接丟棄喔!要好好對待他們,取好檔名整理好保存下來,最好用dropbox或雲端硬碟之類的,將這些貴重資料備份起來!
除了是美好回憶、是你辛苦的結晶,以後還能回頭看看自己的成長,還能進一步檢討改進!題目可不能寫過就算了,要檢討反省才能更加進步喔!光看題數只能自我滿足罷了,學得紮不紮實自己心裏有數。
日後出社會,這些解出的題目也會在面試或履歷上幫助你很多喔!千萬不要丟棄你的後宮!
二、了解批改娘
批改娘也是程式,也是人家飼養的使魔。所以會有一些使魔的特徵,比如說頑固死板!不過,其實這麼說很不公平,讓我們看下面例子:
要求輸出結果Yes你輸出yes他會判定你答錯。
對使魔而言a和A本來就是兩個不同符號。認定不相同很正常啊!
要求輸出結果"1 2 3"你輸出"1 2 3 "或" 1 2 3"或"1 2 3"都錯;
畢竟對批改娘而言連答案長度都不正確啊!
要求輸出結果"1\n2\n3\n"你輸出"1\n2\n3"或"1\n\n2\n\n3\n\n"都錯;
畢竟對批改娘而言連行數都不一樣啊!而且前者對批改娘而言,他會認為你最後一行
並沒有結束。\n的意思是End Of Line,是一行的結束。所以結尾要加\n才會有始有終!
要求輸出結果"3.14159"你輸出"3.14159265"也是錯;
有時題目會限定小數點精確度四捨五入至第幾位,但對批改娘而言他看到的是兩個長度不相同的句子,怎麼會一樣?
要知道,批改娘檢查很精細,而且除非題目特殊,否則不會變通;他看到的不是你輸出結果是比他的解答更精確的圓周率,而是一串ASCII碼,也就是一堆整數而已!
結論: 輸出的結果必須字數相同且每字完全相同。
題目本身會詳細規定輸入與輸出的格式,包括輸入數字的大小範圍。你可以相信題目敘述,但相對的不要做任何無根據的假設或猜測,也不要以為批改娘可能會妥協照你的程式跑,更不會看你輸出的提示。
他會輸入兩個整數,那就是兩個整數;以空白隔開就以空白隔開,不會變成換行。
即使你輸出please input 2 integers separated by new line批改娘也不會理你。
同樣的告訴你是整數,你認為是正整數,就是毫無根據的假設。你答錯就不能怪批改娘。
批改娘會讓你的程式所有輸出都寫入到一個檔案,餵完數據就開始等,看能不能在時間內跑完。能跑完的話,就會把這個檔案拿出來和標準解答比對。
這表示你所有輸出的東西裏面,只有先後順序重要,
比對時若沒有明確說明,就是一律從第一個字開始比,若有比較出不同,或是兩個檔案長度不一,也就是沒有同時結束,就會判定你答案錯誤。畢竟這是最簡單的方式,批改娘很忙的沒辦法也不願意針對每一題都細讀每人的解答做出特殊判斷。要體諒!
也就是說,若你輸出提示句,比如"please enter a number: ",在檢查的時候,你輸出的內容就會多出"please enter a number: "而且這在標準解答不會有,所以你會被判答案錯誤。
批改娘: 誰准你輸出提示句了!? (鞭打)
結論: 不要輸出提示句;或者說,批改娘沒准你輸出的東西通通不准輸出!
其實看到提示句時也已經是比對之時了。
三、溫馨提示
1. 注意數字範圍,我們學過的int只能接受-2147483648至+2147483647(包含這兩數字)的整數,並不是只要是整數都可以存。可能超出時另有解決方法,這之後再提。
2147483647是2的31次方減1。這是特殊數字,請把它背下來,或記住它是怎麼來的,即使忘了也要知道怎麼硬算出來。
2. 幾乎所有題目都是只有一個檔案,這代表一個檔案可能有10萬組數據,所以你的程式不能只計算一次,只處理一組數據。這會有幾種不同方式,問題最大的在於沒告訴你何時結束。
不過沒關係,我們知道輸入數據會是一個檔案,而檔案大小是有限的,總有一天讀得到結尾!不像等候使用者輸入,你永遠不知道他開心了沒想輸入了沒想結束了沒。
因此我們只需要判斷檔案是否已經到了檔案結尾,比如說:
while(scanf("%d%d", &a, &b) != EOF) <== 當輸入尚未碰到檔案結尾就繼續執行
{
printf("%d %d\n", b, a); <== 處理計算
}
在你照著題目範例輸入時,會發現它會長得像這樣:
10 5
5 10
7 22
22 7
輸入和輸出會交錯出現,但那是假像,批改娘只看你輸出的東西,以這例子而言只有
5 10
22 7
所以不用在意交錯的問題。算完就輸出,不需要做什麼特別處理。
3. 注意每組數據「之間空一行」和「之後空一行」的差別。
"A\n\nB\n" 叫作A和B之間空一行。
1122 33 1表示A這行結束,2表示又一行結束,但這行沒有東西(空一行);3表示B這行結束,後面沒有多餘空白行。
"A\n\nB\n\n" 叫作每組之後多空一行。
1122 3344 1表示A這行結束,2馬上又一行結束,表示這是個空白行;34同理
每個數字用空白隔開也是相同道理。
4. 如何複製貼上!每題附的範例都能給你複製了,何苦要自己手打!不如用省下來的時間多解兩題對吧?
首先隨便寫個會停住的程式,比如說用scanf("%d", &a);就會停住等候使用者輸入。
小黑窗標題列按右鍵 -> 預設值 -> 快速編輯模式,勾起來!!然後把程式關掉。
從此以後執行的程式,在小黑窗上按滑鼠右鍵就會貼上,對小黑窗反白後按ENTER可以複製出來!方便吧?
面對批改娘有時可能惡作劇給你一個很大很複雜的範例給你初步測試,有複製貼上省事多了!
之後會在番外篇介紹更多練功場所的介紹與比較,以及各種便利的工具!
另外會有一篇番外篇介紹如何使用BBS,會使用的話可以到我的個人板去找解題相關資料!
約有兩千篇左右的解題提示或詳解或簡單的翻譯!大半是我寫的但也有很多是其它熱心人士貢獻的!
網址: 台南一中資訊社 索尼小站 telnet://sony.tfcis.org
板名: sa072686
但是千萬注意,偷看解答不僅破壞解題樂趣,也容易養成放棄思考直接看解答的習慣,這是惡習!至少先努力想幾個小時真的不行再看,或者AC之後再來比較一下,做個檢討改進!
也許你會覺得比別人多想幾小時,別人早就看完解答學會解法寫別題去啦!但是思考絕對有幫助!他都組隊請人幫打,經驗都被吸光光啦!一旦沒人組隊就完蛋啦自己不會打啦!你比他慢學會,但比他學得紮實,比他更印象深刻,說不定還會有新體悟!
在另一個BBS也有我的個人板,偶有解題相關資訊但是較少,較多的是個人日記啦突發奇想啦雜感或程式心得體會等等亂七八糟的雜物,但解題相關的文標題都相當統一,還算好找;只是真的少很多,建議有點興趣了解我這種奇怪生物再去,只想找解題資訊就別浪費時間了。
網址: 批踢踢兔 telnet://ptt2.cc
板名: sa072686
當然如果你對稀奇古怪的生物有興趣,也歡迎和我交流或來問問題。不過呢,發問前先仔細思考過、整理過思維,確定自己還是毫無頭緒再問,可是基本禮節喔!而且我有我的生活、要工作要休閒還要寫亂七八糟的文污染你們單純的思想,可沒辦法保證總是能快速回覆喔!
下一篇會帶領各位從比較好解的題目下手。如果你在Lucky貓找到的一星題恰巧都很難解,或是上述的提示與解說還不足以讓你了解批改娘,以致明明會解的題目一直被批改娘退件!
不過沒關係,有我帶領你們一起征服批改娘,上述的問題都不必擔心!
下列是建議入門題目,這幾篇都會透過實例,帶領你們了解初步如何和批改娘相處!
建議按照順序觀看。
UVa 11172
UVa 10071
UVa 10055
沒有留言:
張貼留言