編者按:新的一年,“高手論技”繼續(xù)伴隨大家前行,身處一線的你,就那些技術(shù)上最常遇到的故障、最需要解決的難題、最成熟的應(yīng)用……都可以在此暢所欲言,各抒己見。是繼續(xù)圍觀還是現(xiàn)身說法,新浪微群http://q.t.sina.com.cn/264976,期待您的共同參與。
● 信息學(xué)奧賽的意義
全國青少年信息學(xué)奧林匹克聯(lián)賽和全國中學(xué)生生物學(xué)聯(lián)賽、全國中學(xué)生物理競賽、全國高中數(shù)學(xué)聯(lián)賽、全國高中學(xué)生化學(xué)競賽,被稱為國內(nèi)影響力最大的“五大奧賽”。由于參加“五大奧賽”獲得省賽區(qū)一等獎的考生可以享受大學(xué)保送或加分資格,因此每年報(bào)考“五大奧賽”的考生總是樂此不疲,被稱為“小高考”。目前,教育部已經(jīng)出臺政策,從2011年開始,入學(xué)的高中學(xué)生將取消奧賽省級一等獎保送和加分,奧賽的功利性將消失,回歸興趣和愛好。
信息學(xué)奧賽是“五大奧賽”中唯一非高考科目,雖然對高考沒有直接幫助,但參加奧賽學(xué)習(xí),能達(dá)到使大多數(shù)青少年在智力上有所發(fā)展、在能力上有所提高的目標(biāo)。CCF理事長李國杰院士在NOI2009開幕式和NOI25周年紀(jì)念會上曾講到:“給那些學(xué)有余力的中學(xué)生提供學(xué)習(xí)計(jì)算機(jī)科學(xué)的機(jī)會,提高他們的邏輯思維能力和用計(jì)算機(jī)解決問題的能力。競賽本質(zhì)上是面向問題的算法設(shè)計(jì)和計(jì)算機(jī)編程,這就要求學(xué)生有分析問題和設(shè)計(jì)算法的能力,還要有通過編寫程序用計(jì)算機(jī)實(shí)現(xiàn)的能力。有了這種訓(xùn)練,不管將來是否從事計(jì)算機(jī)專業(yè)工作,對學(xué)生都有好處?!?
計(jì)算機(jī)科學(xué)技術(shù)究竟是一門什么學(xué)問?計(jì)算機(jī)科學(xué)教給人們什么樣的思維?中學(xué)生參加信息學(xué)奧林匹克競賽究竟能增長什么能力?這些問題都值得我們深思。
● 讀名詞縮寫,了解信息學(xué)奧賽
CCF:中國計(jì)算機(jī)學(xué)會。這是我國信息學(xué)奧林匹克競賽的主辦者。
NOIP:全國青少年信息學(xué)奧林匹克分區(qū)聯(lián)賽。分為初賽和復(fù)賽兩部分,其中初中學(xué)生可以參加普及組的競賽,高中學(xué)生和初中學(xué)生都可以參加提高組的競賽。
NOI:全國青少年信息學(xué)奧林匹克競賽。這是全國決賽,每個(gè)省根據(jù)規(guī)則選派一定數(shù)量的選手參加,其中至少要有一名女選手。前20名選手獲得金牌,并進(jìn)入國家集訓(xùn)隊(duì)。
NOI冬令營:冬令營培訓(xùn)內(nèi)容包括授課、講座、討論、測試等。參加中國隊(duì)選拔賽隊(duì)員的成績將作為選拔賽成績的一部分記入檔案。
CTSC:中國代表隊(duì)選拔賽暨全國信息學(xué)精英賽。由國家集訓(xùn)隊(duì)和其他80~100人參加,是中國代表隊(duì)人選決定的最重要比賽。
APIO:亞洲與太平洋地區(qū)信息學(xué)奧林匹克競賽。是一個(gè)面向亞太地區(qū)在校學(xué)生的信息學(xué)科競賽。旨在給青少年提供更多的賽事機(jī)會,推動亞太地區(qū)的信息學(xué)奧林匹克發(fā)展。該競賽性質(zhì)為區(qū)域性的網(wǎng)上準(zhǔn)同步賽,每年五月的第一或第二個(gè)星期六舉辦。
IOI:國際信息學(xué)(計(jì)算機(jī))奧林匹克競賽。這是面向全球中學(xué)生的信息學(xué)頂級賽事,每個(gè)國家可以選派4名選手參加。
大多數(shù)省還會舉辦省隊(duì)選拔賽,以選拔參加NOI的省隊(duì)隊(duì)員。
其他競賽如Topcoder、百度之星、網(wǎng)易有道難題等是面向所有人的,獲獎?wù)邔@得豐厚的獎金,中學(xué)生也可以參加。
● 信息學(xué)奧林匹克競賽形式與內(nèi)容
從競賽形式上說,只有NOIP初賽采用筆試,題型分為選擇題(20分)、問題求解(10分)、讀程序?qū)懡Y(jié)果(32分)、程序填空(38分)。選擇題和問題求解涉及計(jì)算機(jī)硬件、軟件、網(wǎng)絡(luò)基礎(chǔ)及數(shù)據(jù)結(jié)構(gòu)與算法、組合數(shù)學(xué)等知識。
其他競賽都是上機(jī)編程,采用黑盒測試的方法評定成績。比如,NOIP復(fù)賽要在3小時(shí)內(nèi)解決4道編程題,每道題在測試時(shí)有10個(gè)測試點(diǎn)(個(gè)別題會有更多),只要使用給定的輸入數(shù)據(jù)得出和輸出結(jié)果一致的,就能得到相應(yīng)分?jǐn)?shù)。當(dāng)然,競賽的另一個(gè)特點(diǎn)是每道題都有時(shí)間限制和空間限制,大多數(shù)題要求在1秒之內(nèi)得到結(jié)果,不同競賽對空間的要求會有差別,目前NOIP復(fù)賽每道題允許使用的空間是128MB。即使答案正確,如果超時(shí)或超空間,也會是0分。
信息學(xué)奧賽涉及的知識面非常廣泛,有些難度達(dá)到大學(xué)本科甚至研究生的課程。因?yàn)閮?nèi)容繁雜深奧,通常要經(jīng)過四到五年的刻苦學(xué)習(xí)才能達(dá)到較高的水平。
● 如何評測你的程序
因?yàn)楦傎惢旧隙际遣捎蒙蠙C(jī)編程、黑盒測試的形式,那么平時(shí)如何評測學(xué)生的成績呢?我們可以為每道題編寫一個(gè)批處理文件,以此對程序的輸入輸出和標(biāo)準(zhǔn)輸入輸出相對比。這個(gè)方法比較原始,但在沒有評測軟件提供的環(huán)境下還是一個(gè)不錯(cuò)的方法。平時(shí)練習(xí)時(shí),我們可以使用Cena或清澄評測軟件評定學(xué)生成績。
Cena是開放源程序的信息學(xué)競賽評測系統(tǒng),能滿足大多數(shù)的評測需求。它能通過局域網(wǎng)自動收取選手程序,但每臺學(xué)生機(jī)都必須安裝Cena客戶端,有一定的麻煩。我使用的方法是在教師機(jī)上安裝FTP軟件,學(xué)生通過FTP上傳相應(yīng)的程序,然后在教師機(jī)上統(tǒng)一評測,以下是主要的操作步驟。
首先在教師機(jī)上安裝Cena。然后在某個(gè)分區(qū),如D盤下建立一個(gè)文件夾專門存放測試程序,我將其命名為test。在test下再建一個(gè)文件夾,名為期末考查。打開Cena軟件,自動彈出“新建或打開”窗口。單擊“新建”頁,在“競賽標(biāo)題”下輸入期末考查,然后在“保存在”下面選擇D盤下的“test\\期末考查”文件夾,再按確定。在彈出的警告窗口中按“確定”。
現(xiàn)在在文件夾D:\est\\期末考查下將自動建立兩個(gè)文件夾,其中data文件夾里面是放測試數(shù)據(jù)的,把期末考查用到的四道題復(fù)制到data文件夾下。另一個(gè)文件夾src是用來存放待測試程序的。打開FTP軟件,建立一個(gè)新的用戶,用戶目錄指向D:\est\\期末考查\\src,將權(quán)限設(shè)置為可讀可寫可修改可刪除。學(xué)生在做完題目以后,用這個(gè)用戶名把源程序上傳。按照NOIP復(fù)賽的要求,在src文件夾下先建立以學(xué)生名字命名的文件夾,然后以題目的英文名字為名在自己的文件夾下建立四個(gè)文件夾,分別把源程序放在這四個(gè)文件夾下。
回到Cena進(jìn)行配置。單擊菜單“工具-選項(xiàng)”,在“選項(xiàng)”窗口中“默認(rèn)內(nèi)在限制”原來為2560KB,現(xiàn)在NOIP復(fù)賽的空間限制為128MB,我們可以把值修改一下。值修改完后將在以后所有的考試中起作用。
在Cena主窗口中單擊“試題”頁,在“綱要”下右擊,選“添加試題”。比如,第一題文件名為music,則在試題標(biāo)題后輸入music,源文件后輸入“music\\music”。注意文件名后面一定不能添加擴(kuò)展名,否則將出現(xiàn)錯(cuò)誤。如果源程序是放在自己的根目錄下,那么在源文件里只要輸入music就可以了?!拜斎胛募焙竺孑斎腩}目中要求使用的名字,一般是題目名.in,如這里是music.in,輸出文件則為music.out。一般的題目不用改動比較方式。
添加完題目以后,再在試題1下右擊,選“添加測試點(diǎn)”。在右邊的窗口輸入文件后單擊,如果data下相應(yīng)題目的測試數(shù)據(jù)所建文件夾和題目的名字是相同的,將會自動列出來。我們選擇序號最小的一個(gè)輸入文件,如music0.in,輸出文件位置選擇“music0.out”。我們還可以對這道題的分值、時(shí)間限制、內(nèi)存限制進(jìn)行修改。再在“試題1”下右擊,選“添加其他測試點(diǎn)”,軟件將自動按序號把其他測試點(diǎn)添加上去。
用同樣的方法把其他三道題添加進(jìn)來,單擊“選手”頁,按“全部評測”按鈕,軟件將對已經(jīng)上交的程序進(jìn)行評測,給出最后的得分和用時(shí)等信息。在“統(tǒng)計(jì)與分析”頁,可以對某些題或某些選手的做題情況進(jìn)行分析。
要注意的是,NOIP復(fù)賽提高組必須經(jīng)過CCF最終評測,這個(gè)評測是在Linux下用北京航天航空大學(xué)編寫的評測軟件完成的,與在Windows下評測的結(jié)果可能會出現(xiàn)一些差異,特別是Linux下文件名大小寫是敏感的,大家一定要注意。另外,NOIP提高組復(fù)賽CCF推薦在Linux下進(jìn)行,有部分省市已經(jīng)開始實(shí)施了,而NOI是必須在Linux下進(jìn)行的,所以參加競賽的選手要預(yù)先熟悉Linux環(huán)境。
● 語言的選擇
競賽規(guī)定可以使用Pascal、C、C++三門語言。在如何選擇語言方面,許多人都很糾結(jié)。每種語言都有自己的優(yōu)劣,我們只針對競賽中語言的特點(diǎn)進(jìn)行一些分析。
1.語言特點(diǎn)
Pascal具有嚴(yán)格的結(jié)構(gòu)化形式、豐富完備的數(shù)據(jù)類型、運(yùn)行效率高、查錯(cuò)能力強(qiáng)等特點(diǎn),可以方便用于描述各種算法和數(shù)據(jù)結(jié)構(gòu)。對于程序設(shè)計(jì)的初學(xué)者,Pascal語言有益于培養(yǎng)良好的程序設(shè)計(jì)風(fēng)格和習(xí)慣。C語言的優(yōu)點(diǎn)是簡潔、緊湊、使用方便、靈活、易于學(xué)習(xí)和應(yīng)用,程序的書寫形式也很自由,適合初學(xué)者使用。C語言的弱點(diǎn)也很明顯:非強(qiáng)制類型;語法限制不嚴(yán)格,使得編程者無法過多地依賴C編譯程序去查錯(cuò);缺少實(shí)時(shí)檢查,如數(shù)組越界等。因?yàn)镃++是C的擴(kuò)展,所以也具有C的特點(diǎn)。C++在C的基礎(chǔ)上,加入了面向?qū)ο缶幊趟枷搿?br/> 2.參考資料
需要大量的參考資料,也是奧賽學(xué)習(xí)的一個(gè)特點(diǎn)。因?yàn)镻ascal在競賽中使用的時(shí)間更長,市面上可以買到的參考書大多以Pascal或類Pascal寫成。當(dāng)然,現(xiàn)在的一個(gè)趨勢是用C/C++寫的參考書越來越多,網(wǎng)絡(luò)上各大題庫的題解以C++占絕對主流。
3.運(yùn)行速度
對于三門語言的運(yùn)行速度,到底誰最快?筆者分別以三門語言計(jì)算一千萬次加法,以cena反復(fù)測試,結(jié)果基本穩(wěn)定如圖1。一千萬次除法(整除)的評測結(jié)果如圖2。在上兩次的測試中,Pascal的劣勢就比較明顯了。再來看看一千萬次求模運(yùn)算,C/C++和Pascal的差異更加明顯了(如圖3)。
雖然對浮點(diǎn)數(shù)運(yùn)算、邏輯運(yùn)算、指針運(yùn)算等沒有繼續(xù)進(jìn)行全面測試,但基本上可以得出如下結(jié)論:C++和C語言的速度基本上處于同一級別;而C/C++和Pascal相比,確實(shí)在運(yùn)行速度上有一定優(yōu)勢。當(dāng)然,從出題時(shí)通常以標(biāo)程的1/10作為時(shí)間限制的角度來說,只要算法一致,C/C++能在規(guī)定時(shí)間內(nèi)出解,Pascal也是可以的,在這方面大家不用過于擔(dān)心。只有當(dāng)三者算法都不是最優(yōu),解題時(shí)間接近時(shí)間限制時(shí),C/C++可能會顯示出它一定的優(yōu)勢。
要注意的是,不同硬件配置的機(jī)器,運(yùn)行同一程序所用的時(shí)間是不同的。同一臺機(jī)器多次測試同一程序,運(yùn)行時(shí)間也會略有差異。但它們?nèi)叩南鄬﹃P(guān)系是基本不變的。
4.其他方面
C/C++語言簡約,同樣的程序,它們比Pascal要少打不少字母和符號。C++在競賽中可以使用STL中的模板,其中含有大量比較實(shí)用的函數(shù),在競賽時(shí)使用可以提高程序的正確性和速度。
從近幾年NOIP的報(bào)名情況來看,使用Pascal的還是占絕大多數(shù),但C++語言的使用者在逐漸增多。如果只從競賽的角度來看,C++有一定優(yōu)勢。個(gè)人建議,對小學(xué)高年級、初中低年級的入門者來說,最好選擇Pascal;對初中高年級和高中學(xué)生來說,可以選擇C++;特別是進(jìn)入大學(xué)以后,如果參加ACM/ICPC,那么只能使用C/C++/Java語言,學(xué)習(xí)Pascal的學(xué)生要在適當(dāng)?shù)臅r(shí)候轉(zhuǎn)學(xué)另外的語言。
信息學(xué)奧林匹克,教給學(xué)生的不僅僅是一種語言、幾種算法,競賽對學(xué)生的學(xué)習(xí)方法、思維能力、性格培養(yǎng)等方面的影響是非常深刻的。對愛好計(jì)算機(jī)而又學(xué)有余力的學(xué)生,信息學(xué)奧賽將展現(xiàn)出一個(gè)精彩的世界。