【內容簡介】
本教材設計包含三個面向:系統、基礎、題解。在系統方面,我們在第一章介紹ACM-ICPC及CPE的發展與規則;第二章介紹CPE線上(on-line)練習與現場(on-site)考試的系統與機制;第三章介紹一個本機端的練習軟體——瘋狂程設,它透過測資腳本與批改腳本讓學生在練習中減少語法、語意與邏輯的錯誤,也透過短碼競賽讓學生能更精簡地撰寫程式。
在基礎方面,第四章介紹C與C++輸入輸出的函式與格式,減少初學學生因為程式輸出輸入問題造成上傳程式錯誤的可能;第五章有系統地講解解題技能,從理解題意到挑選合適的演算法(包括排序、搜尋、貪心(greedy)、動態規劃、圖形走訪、最小生成樹、最短路徑、最大流等常用演算法)不一而足,同時考量程式執行時間與記憶體用量,並交代如何設計測資以在上傳程式前檢驗程式的正確性;最後提醒要善用既有資源,利用函式庫來設計解題所需的功能,以減少撰寫程式的時間。
在題解方面,我們依據難易等級提供三章共84題之題解,另有8題用在前面章節中做為例子。第六章至第八章分別是一顆星至三顆星題目之題解,除了區分難易度,再依據題型分節,其中包含字元與字串、數學計算、大數運算、幾何、排序、圖論、模擬、動態規劃等。讀者可以透過本書進入程式設計之門,並培養精進解題與程式的實力。
【內容摘錄】
序
拔擢頂尖vs.提升平均
由於ACM-ICPC亞洲區黃金雄主任(美國德州大學教授)的鼓勵與協助,「國際計算機器協會程式競賽台灣協會」(ACM ICPC Contest Council for Taiwan) 於2008年成立。成立之初,協會的思考重點都在如何拔擢頂尖,讓更多的頂尖學生參加ACM-ICPC區賽(Regional Contest)及總決賽(World Final)。但我們很快地發現,拔尖只關注大約前5%的少數學生,大部分學生對這些國際競賽幾乎沒有投入甚或注意。根據我們的觀察,由於程式作業抄襲或修改容易,約四分之一的資訊系學生不太會寫程式(各校比率略有差異),四分之三的學生程式寫得不夠多(除了修課作業與專題要求之外不寫程式),未來會選擇從事程式設計的學生不到二分之一,其他傾向轉而投入不太需要撰寫程式的工作。這種「生態」當然影響了國家資通訊產業設計產品的「產能」,而產業界對於大學生的程式設計訓練不夠紮實也是抱怨聲不斷。因為這導致他們在徵聘新人時,必須透過自己設計的程式測驗才能挑選出適合的人才。
許多大學教授因有研究論文發表的壓力,對於研究生的研究要求,著重於創新設計與理論分析的突破,而較少要求系統實作之苦工。他們因為專心致力於研究,而無暇顧及基礎的程式教學訓練。有心於大學部程式訓練課程的教授,單憑一己之力也很難改變整個生態。
上述的情形讓協會開始在拔尖之餘,開始省思如何提升整體平均。思考的大方向是將ACM-ICPC國際賽的題庫拿來做為標準測驗的題目,然後推廣至各校共同辦理測驗,並且採認於大學部畢業要件與研究所入學參考。因為ACM-ICPC國際賽的題目都經過歷練,有相當的品質與水準,所以不需要擔心題目品質的問題;也因為題庫夠大(目前已經超過3600題,並且陸續增加中),所以也不需要擔心學生可能做過我們所挑選的題目。如果學生做過題目而且在考試時也可以寫得出程式,其程式能力必定也相當不錯,畢竟程式設計需要理解與邏輯思考,無法單靠死背。有了題目品質的保證後,我們設計了「大學程式能力檢定」 (Collegiate Programming Examination, CPE) 做為考試的形式與機制,希望透過CPE及各校的共同參與來改變上述的生態,藉此提高台灣資訊產業的產能與競爭力,並增加參加國際競賽的可能人口。
CPE配方:多校、千人、同步、遠距、同一份題目之程式能力檢定
CPE具有獨特的配方,而有別於現有的競賽與檢定系統,例如ACM-ICPC區賽與總決賽使用單一實體場地最多100隊同時競賽,或電腦技能檢定在電腦教室隨時有人考試,而考題由遠端的伺服器隨機抽取。上述兩種實體場地或遠端題庫的模式都無法滿足千人同時考試的目標,必須結合兩者才能達到。所以「CPE的配方」是多校、千人、同步、遠距、同一份題目;多校的場地才能免除舟車勞頓,又能達到千人的規模,而遠距題庫能支援各校同步舉辦來考同一份題目。
由於CPE是一項檢定考試,監考、防弊與系統穩定度非常重要。學生在各校的電腦教室考試,用戶端的電腦軟體必須確保學生無法連線到非CPE伺服器以外的地方,而CPE係透過虛擬主機的機制達到這項限制。此外,各校考場需避免學生在現場交談作弊,甚或冒名考試,所以電腦教室要有專人監考。伺服器端除了支援多校千人同步存取題目,以及自動評審學生上傳的程式之外,還要克服系統延展性與穩定性的問題。目前CPE系統架構有多台前端與後端伺服器,可兼具支援大量考生4 5 0 ; &# 3 6 9 4 8 ; &# 2 1 0 4 0 ; &# 2 0 2 8 2 ; &# 2 6 3 8 1 ; &# 2 2 1 2 0 ; &# 3 1 3 3 7 ; &# 2 3 4 5 0 ; &# 2 0 6 3 3 ; &# 2 5 5 8 8 ; &# 3 0 3 4 0 ; &# 3 0 4 4 6 ; &# 3 0 3 4 0 ; &# 1 2 2 9 0 ; b r / > &# 2 1 0 6 9 ; &# 3 6 8 4 8 ; &# 2 5 5 5 2 ; &# 2 1 0 4 0 ; &# 6 5 2 9 2 ; &# 3 8 9 8 8 ; &# 3 0 4 4 6 ; &# 2 6 1 5 9 ; &# 3 0 0 0 1 ; &# 6 5 ; &# 6 7 ; &# 7 7 ; &# 4 5 ; &# 7 3 ; &# 6 7 ; &# 8 0 ; &# 6 7 ; &# 2 1 3 1 2 ; &# 3 6 0 9 3 ; &# 3 3 2 8 7 ; &# 3 2 3 1 7 ; &# 2 7 7 7 0 ; &# 3 6 0 9 3 ; &# 2 7 6 0 4 ; &# 3 6 0 9 3 ; &# 3 6 9 4 2 ; &# 3 2 7 8 0 ; &# 2 5 9 1 0 ; &# 3 7 6 3 6 ; &# 2 6 0 4 4 ; &# 8 5 ; &# 8 6 ; &# 6 5 ; &# 3 8 9 8 8 ; &# 2 4 2 3 5 ; &# 6 5 2 9 2 ; &# 2 1 6 9 7 ; &# 3 6 0 7 4 ; &# 2 7 7 9 4 ; &# 2 6 3 7 7 ; &# 2 1 8 3 9 ; &# 3 8 9 8 8 ; &# 6 5 2 9 2 ; &# 2 1 4 8 7 ; &# 2 0 1 9 7 ; &# 3 6 9 9 1 ; &# 2 0 8 1 3 ; &# 2 2 8 1 0 ; &# 2 4 1 8 0 ; &# 2 1 0 6 9 ; &# 3 6 0 3 9 ; &# 3 5 3 3 8 ; &# 2 5 9 4 5 ; &# 3 2 9 4 6 ; &# 3 0 0 2 8 ; &# 2 5 5 1 2 ; &# 2 1 2 0 5 ; &# 8 4 ; &# 7 1 ; &# 8 2 ; &# 6 9 ; &# 2 2 2 4 0 ; &# 3 8 9 8 8 ; &# 2 4 2 3 5 ; &# 2 1 6 9 7 ; &# 3 6 0 7 4 ; &# 2 1 8 3 9 ; &# 3 8 9 8 8 ; &# 6 5 2 9 2 ; &# 3 6 8 9 6 ; &# 2 5 1 0 4 ; &# 3 2 7 7 1 ; &# 3 5 4 3 0 ; &# 2 5 1 0 4 ; &# 3 2 3 1 8 ; &# 3 7 9 6 9 ; &# 2 1 0 2 9 ; &# 2 1 1 4 7 ; &# 1 9 9 8 1 ; &# 3 6 2 7 5 ; &# 3 0 3 4 0 ; &# 2 4 7 7 3 ; &# 2 4 4 1 8 ; &# 1 2 2 9 0 ; &# 2 0 2 9 4 ; &# 2 6 1 5 9 ; &# 6 5 2 9 2 ; &# 8 5 ; &# 8 6 ; &# 6 5 ; &# 3 8 9 8 8 ; &# 2 4 2 3 5 ; &# 2 0 0 0 6 ; &# 2 7 7 9 4 ; &# 2 6 3 7 7 ; &# 2 0 8 4 4 ; &# 2 4 0 6 7 ; &# 1 9 9 7 8 ; &# 2 0 6 5 9 ; &# 3 1 2 4 3 ; &# 2 4 3 3 5 ; &# 3 0 3 4 0 ; &# 2 8 2 0 4 ; &# 3 5 4 3 0 ; &# 3 6 0 3 9 ; &# 2 6 0 0 9 ; &# 6 5 2 8 8 ; &# 3 1 7 7 7 ; &# 3 1 2 8 1 ; &# 2 8 2 0 4 ; &# 3 6 0 3 9 ; &# 6 5 2 8 9 ; &# 6 5 2 9 2 ; &# 2 5 1 5 2 ; &# 2 0 1 9 7 ; &# 6 7 ; &# 8 0 ; &# 6 9 ; &# 2 2 3 1 2 ; &# 2 5 3 6 1 ; &# 3 6 9 8 4 ; &# 3 8 9 8 8 ; &# 3 0 4 4 6 ; &# 2 6 1 7 8 ; &# 2 4 5 1 7 ; &# 3 8 9 2 0 ; &# 3 3 2 5 8 ; &# 3 4 8 9 2 ; &# 2 8 3 1 0 ; &# 2 0 6 3 3 ; &# 2 8 2 0 4 ; &# 3 6 0 3 9 ; &# 1 2 2 9 0 ; &# 2 1 4 7 8 ; &# 2 2 8 0 6 ; &# 6 5 2 9 2 ; &# 6 5 ; &# 6 7 ; &# 7 7 ; &# 4 5 ; &# 7 3 ; &# 6 7 ; &# 8 0 ; &# 6 7 ; &# 2 1 3 1 2 ; &# 3 6 0 9 3 ; &# 3 3 2 8 7 ; &# 3 2 3 1 7 ; &# 2 7 7 7 0 ; &# 3 6 0 9 3 ; &# 3 6 9 1 4 ; &# 3 4 8 9 2 ; &# 2 0 1 1 6 ; &#
本教材設計包含三個面向:系統、基礎、題解。在系統方面,我們在第一章介紹ACM-ICPC及CPE的發展與規則;第二章介紹CPE線上(on-line)練習與現場(on-site)考試的系統與機制;第三章介紹一個本機端的練習軟體——瘋狂程設,它透過測資腳本與批改腳本讓學生在練習中減少語法、語意與邏輯的錯誤,也透過短碼競賽讓學生能更精簡地撰寫程式。
在基礎方面,第四章介紹C與C++輸入輸出的函式與格式,減少初學學生因為程式輸出輸入問題造成上傳程式錯誤的可能;第五章有系統地講解解題技能,從理解題意到挑選合適的演算法(包括排序、搜尋、貪心(greedy)、動態規劃、圖形走訪、最小生成樹、最短路徑、最大流等常用演算法)不一而足,同時考量程式執行時間與記憶體用量,並交代如何設計測資以在上傳程式前檢驗程式的正確性;最後提醒要善用既有資源,利用函式庫來設計解題所需的功能,以減少撰寫程式的時間。
在題解方面,我們依據難易等級提供三章共84題之題解,另有8題用在前面章節中做為例子。第六章至第八章分別是一顆星至三顆星題目之題解,除了區分難易度,再依據題型分節,其中包含字元與字串、數學計算、大數運算、幾何、排序、圖論、模擬、動態規劃等。讀者可以透過本書進入程式設計之門,並培養精進解題與程式的實力。
【內容摘錄】
序
拔擢頂尖vs.提升平均
由於ACM-ICPC亞洲區黃金雄主任(美國德州大學教授)的鼓勵與協助,「國際計算機器協會程式競賽台灣協會」(ACM ICPC Contest Council for Taiwan) 於2008年成立。成立之初,協會的思考重點都在如何拔擢頂尖,讓更多的頂尖學生參加ACM-ICPC區賽(Regional Contest)及總決賽(World Final)。但我們很快地發現,拔尖只關注大約前5%的少數學生,大部分學生對這些國際競賽幾乎沒有投入甚或注意。根據我們的觀察,由於程式作業抄襲或修改容易,約四分之一的資訊系學生不太會寫程式(各校比率略有差異),四分之三的學生程式寫得不夠多(除了修課作業與專題要求之外不寫程式),未來會選擇從事程式設計的學生不到二分之一,其他傾向轉而投入不太需要撰寫程式的工作。這種「生態」當然影響了國家資通訊產業設計產品的「產能」,而產業界對於大學生的程式設計訓練不夠紮實也是抱怨聲不斷。因為這導致他們在徵聘新人時,必須透過自己設計的程式測驗才能挑選出適合的人才。
許多大學教授因有研究論文發表的壓力,對於研究生的研究要求,著重於創新設計與理論分析的突破,而較少要求系統實作之苦工。他們因為專心致力於研究,而無暇顧及基礎的程式教學訓練。有心於大學部程式訓練課程的教授,單憑一己之力也很難改變整個生態。
上述的情形讓協會開始在拔尖之餘,開始省思如何提升整體平均。思考的大方向是將ACM-ICPC國際賽的題庫拿來做為標準測驗的題目,然後推廣至各校共同辦理測驗,並且採認於大學部畢業要件與研究所入學參考。因為ACM-ICPC國際賽的題目都經過歷練,有相當的品質與水準,所以不需要擔心題目品質的問題;也因為題庫夠大(目前已經超過3600題,並且陸續增加中),所以也不需要擔心學生可能做過我們所挑選的題目。如果學生做過題目而且在考試時也可以寫得出程式,其程式能力必定也相當不錯,畢竟程式設計需要理解與邏輯思考,無法單靠死背。有了題目品質的保證後,我們設計了「大學程式能力檢定」 (Collegiate Programming Examination, CPE) 做為考試的形式與機制,希望透過CPE及各校的共同參與來改變上述的生態,藉此提高台灣資訊產業的產能與競爭力,並增加參加國際競賽的可能人口。
CPE配方:多校、千人、同步、遠距、同一份題目之程式能力檢定
CPE具有獨特的配方,而有別於現有的競賽與檢定系統,例如ACM-ICPC區賽與總決賽使用單一實體場地最多100隊同時競賽,或電腦技能檢定在電腦教室隨時有人考試,而考題由遠端的伺服器隨機抽取。上述兩種實體場地或遠端題庫的模式都無法滿足千人同時考試的目標,必須結合兩者才能達到。所以「CPE的配方」是多校、千人、同步、遠距、同一份題目;多校的場地才能免除舟車勞頓,又能達到千人的規模,而遠距題庫能支援各校同步舉辦來考同一份題目。
由於CPE是一項檢定考試,監考、防弊與系統穩定度非常重要。學生在各校的電腦教室考試,用戶端的電腦軟體必須確保學生無法連線到非CPE伺服器以外的地方,而CPE係透過虛擬主機的機制達到這項限制。此外,各校考場需避免學生在現場交談作弊,甚或冒名考試,所以電腦教室要有專人監考。伺服器端除了支援多校千人同步存取題目,以及自動評審學生上傳的程式之外,還要克服系統延展性與穩定性的問題。目前CPE系統架構有多台前端與後端伺服器,可兼具支援大量考生4 5 0 ; &# 3 6 9 4 8 ; &# 2 1 0 4 0 ; &# 2 0 2 8 2 ; &# 2 6 3 8 1 ; &# 2 2 1 2 0 ; &# 3 1 3 3 7 ; &# 2 3 4 5 0 ; &# 2 0 6 3 3 ; &# 2 5 5 8 8 ; &# 3 0 3 4 0 ; &# 3 0 4 4 6 ; &# 3 0 3 4 0 ; &# 1 2 2 9 0 ; b r / > &# 2 1 0 6 9 ; &# 3 6 8 4 8 ; &# 2 5 5 5 2 ; &# 2 1 0 4 0 ; &# 6 5 2 9 2 ; &# 3 8 9 8 8 ; &# 3 0 4 4 6 ; &# 2 6 1 5 9 ; &# 3 0 0 0 1 ; &# 6 5 ; &# 6 7 ; &# 7 7 ; &# 4 5 ; &# 7 3 ; &# 6 7 ; &# 8 0 ; &# 6 7 ; &# 2 1 3 1 2 ; &# 3 6 0 9 3 ; &# 3 3 2 8 7 ; &# 3 2 3 1 7 ; &# 2 7 7 7 0 ; &# 3 6 0 9 3 ; &# 2 7 6 0 4 ; &# 3 6 0 9 3 ; &# 3 6 9 4 2 ; &# 3 2 7 8 0 ; &# 2 5 9 1 0 ; &# 3 7 6 3 6 ; &# 2 6 0 4 4 ; &# 8 5 ; &# 8 6 ; &# 6 5 ; &# 3 8 9 8 8 ; &# 2 4 2 3 5 ; &# 6 5 2 9 2 ; &# 2 1 6 9 7 ; &# 3 6 0 7 4 ; &# 2 7 7 9 4 ; &# 2 6 3 7 7 ; &# 2 1 8 3 9 ; &# 3 8 9 8 8 ; &# 6 5 2 9 2 ; &# 2 1 4 8 7 ; &# 2 0 1 9 7 ; &# 3 6 9 9 1 ; &# 2 0 8 1 3 ; &# 2 2 8 1 0 ; &# 2 4 1 8 0 ; &# 2 1 0 6 9 ; &# 3 6 0 3 9 ; &# 3 5 3 3 8 ; &# 2 5 9 4 5 ; &# 3 2 9 4 6 ; &# 3 0 0 2 8 ; &# 2 5 5 1 2 ; &# 2 1 2 0 5 ; &# 8 4 ; &# 7 1 ; &# 8 2 ; &# 6 9 ; &# 2 2 2 4 0 ; &# 3 8 9 8 8 ; &# 2 4 2 3 5 ; &# 2 1 6 9 7 ; &# 3 6 0 7 4 ; &# 2 1 8 3 9 ; &# 3 8 9 8 8 ; &# 6 5 2 9 2 ; &# 3 6 8 9 6 ; &# 2 5 1 0 4 ; &# 3 2 7 7 1 ; &# 3 5 4 3 0 ; &# 2 5 1 0 4 ; &# 3 2 3 1 8 ; &# 3 7 9 6 9 ; &# 2 1 0 2 9 ; &# 2 1 1 4 7 ; &# 1 9 9 8 1 ; &# 3 6 2 7 5 ; &# 3 0 3 4 0 ; &# 2 4 7 7 3 ; &# 2 4 4 1 8 ; &# 1 2 2 9 0 ; &# 2 0 2 9 4 ; &# 2 6 1 5 9 ; &# 6 5 2 9 2 ; &# 8 5 ; &# 8 6 ; &# 6 5 ; &# 3 8 9 8 8 ; &# 2 4 2 3 5 ; &# 2 0 0 0 6 ; &# 2 7 7 9 4 ; &# 2 6 3 7 7 ; &# 2 0 8 4 4 ; &# 2 4 0 6 7 ; &# 1 9 9 7 8 ; &# 2 0 6 5 9 ; &# 3 1 2 4 3 ; &# 2 4 3 3 5 ; &# 3 0 3 4 0 ; &# 2 8 2 0 4 ; &# 3 5 4 3 0 ; &# 3 6 0 3 9 ; &# 2 6 0 0 9 ; &# 6 5 2 8 8 ; &# 3 1 7 7 7 ; &# 3 1 2 8 1 ; &# 2 8 2 0 4 ; &# 3 6 0 3 9 ; &# 6 5 2 8 9 ; &# 6 5 2 9 2 ; &# 2 5 1 5 2 ; &# 2 0 1 9 7 ; &# 6 7 ; &# 8 0 ; &# 6 9 ; &# 2 2 3 1 2 ; &# 2 5 3 6 1 ; &# 3 6 9 8 4 ; &# 3 8 9 8 8 ; &# 3 0 4 4 6 ; &# 2 6 1 7 8 ; &# 2 4 5 1 7 ; &# 3 8 9 2 0 ; &# 3 3 2 5 8 ; &# 3 4 8 9 2 ; &# 2 8 3 1 0 ; &# 2 0 6 3 3 ; &# 2 8 2 0 4 ; &# 3 6 0 3 9 ; &# 1 2 2 9 0 ; &# 2 1 4 7 8 ; &# 2 2 8 0 6 ; &# 6 5 2 9 2 ; &# 6 5 ; &# 6 7 ; &# 7 7 ; &# 4 5 ; &# 7 3 ; &# 6 7 ; &# 8 0 ; &# 6 7 ; &# 2 1 3 1 2 ; &# 3 6 0 9 3 ; &# 3 3 2 8 7 ; &# 3 2 3 1 7 ; &# 2 7 7 7 0 ; &# 3 6 0 9 3 ; &# 3 6 9 1 4 ; &# 3 4 8 9 2 ; &# 2 0 1 1 6 ; &#