1. 程式人生 > >NOIP複賽複習(十)怎樣才能拿到高分?

NOIP複賽複習(十)怎樣才能拿到高分?

摘要

考場策略和程式測試是資訊學競賽中非常重要的環節,很多優秀的選手在很多比賽中總是會在這兩個環節上犯下這樣和那樣的錯誤,導致得到的分數和實力不成正比,最後留下了無盡的遺憾。本文將探討一些這兩個環節上值得注意的地方,提出一些可行的方法,分享一些經驗,以此希望幫助選手們在比賽中發揮水平,減少失誤,告別遺憾。

 

前言

資訊學競賽本身是一個美好的東西,她包含著奮鬥、努力、追求、成長、汗水和收穫。一個選手從與其接觸,到了解,再到熱愛,無數的時間與之為伴同樣,資訊學也給予了我們太多:給予了友情,老師的關懷,太多的希冀、責任和無數難以忘懷經歷。

可是,太多的時候,資訊學競賽總是透著那麼多的憂傷,似乎她帶來的美輪美奐的精彩總被那些無可奈何的淚水和發自內心的懊悔所掩蓋。

遺憾——如此悲情的字眼的不停出現,似乎把本該光鮮的資訊學競賽抹上了灰色。

遺憾,那麼傷痛,尋根溯源,筆者希望以此文,讓大家發揮水平,讓這個詞語永遠的離大家而去。

 

一、簡介

1、什麼是考場策略?

一場資訊學競賽,比賽時間從 3 個小時到個小時不等,題目從 3 題到 4 題不等。在這樣的一個長時間的過程裡,如何分配時間,如何對待手上的題目,用什麼方式和順序對待手上的題目等等一系列的決策問題,我們稱之為考場策略。

2、什麼是程式測試

程式測試就是在寫完程式後,利用各種方式檢驗程式正確性的過程。

3、二者有什麼關係?

概要的說,考場策略包含了程式測試這一個環節,因而本文中,對於考場策略我們討論的是一個總攬全域性的安排,而程式測試討論的則是具體的實施方法。

可以說,考場策略的制定在程式測試之前,而程式測試又能影響到考場策略的實施。

 

二、考場策略

一個完整的測試包括審題,思考,做題,檢驗這幾個環節,我們將分開討論這幾個步驟。


1、審題

【建議 1】一場測試應該花至少 30 分鐘來審題,並做相關筆錄。

1.1重要性

很多同學覺得這花去的時間太多了,大大佔用了之後的解題時間。但是無數的事實告訴

了我們審題的重要性,無數的遺憾正是由審題開始的。

【例項 1 NOI2008 Day1 party 具體題目略。

事實:

此題是NOI2008 day1的第一道題,也是最容易拿分的題目,此題有50%的小資料,因此使用暴力列舉演算法能夠至少拿到 50 分。而悲劇也正從這一刻開始了。

注意題目中這樣一句話:輸出檔案party.out包含兩個數,第一個數為最大可能的面具類數,第二個數為最小可能的面具類數。也就是說,假設輸出的兩個數為AB,那麼應該滿足A>=B

題目描述清晰。可是,現場江蘇省隊11人中,僅毛傑明,卞晶、楊晶和汪一寧四人看對這一條件,其他7人均將小的那一個先輸出,再將大的那一個輸出。因此7人最高分僅30分。其中金斌損失近 70分。

原因分析:

客觀原因:

1、樣例中輸出的兩個數是一樣的,並沒有體現需要題目描述;

2、以往所有的題目都是先輸出小的再輸出大的,而這一次比較特殊。

主觀原因:

據事後交流,所有人都沒有花足夠的時間在審題這一環節上,而是花了更多的時間在演算法思考和程式設計上。對題目的理解過份依靠直覺和以往經驗。


【例項2APIO2009 convention 具體題目略。

事實:

注意題目中有這樣對方案的描述:首先,將租借給客戶數量最多的策略最為候選,將所有的公司按照他們發出請求的順序編號。對於候選策略,將策略中的每家公司的編號按升序排列。最後選出其中字典序最小的候選策略作為最終的策略。

這段描述一共有三句話,本屆江蘇省隊11人中有6(包括筆者)都看清楚了第一句話和最後一句話,但都沒有注意到第二句話,因而此題均為0分。

而此題有50%的小資料,即用替代演算法也可得到50%的分數。此外,事實證明利用錯誤的貪心演算法也可以得到50分左右的分數。以筆者為例,筆者如果此題加上50分則將得到國際金牌,其遺憾不言而喻。

原因分析:

客觀原因:

1、這道題目描述比較冗長,這一句條件並不是很顯眼,並且去掉這個條件仍然是一道複雜度相同的問題;

2、樣例和題目舉的例子中均未體現這一個條件。

經過交流,所有看錯此題選手,均是由於題目描述的冗長,為了節省時間,未能仔細斟酌文字描述,而是直接通過題目的例子來理解題目,因而主觀的忽略了這一個條件。

分析一下上述兩個例子,可以發現一些共性。

大家的目的都是為了快速的理解題目,都是過多的相信了經驗和習慣,都是隻關注題目所給樣例。可見,發生這種悲劇的原因都屬無視了審題這一環節的重要性!

到這裡顯然筆者已經不用再重申審題環節的重要性了。

不要因為某一次成功的因為經驗或者小聰明節省了幾分鐘的寫程式的時間而沾沾自喜,這樣的做法如果成為了習慣,那麼遺憾將是必然的。

1.2標記法

為了解決這一問題,筆者總結了一些方法,稱其為標記法,基本的方式都是用筆在紙製題目上進行標記。

關鍵字:對於題目中的一些關鍵字,將其圈出

所謂關鍵字就是比較級,最高階等形容詞,和一些關鍵的名字。

序號:對於一些定義冗長的描述,每一步的限制都標上序號,從而明確對題目的理解

建議是做到每一個標點後都要做一定的標記,這樣避免漏掉一些描述。當然也可以不用每個標點後都寫數字,如果兩個短句都在說同一個事情,那麼可以用一個點,或者一個三角來表示後一個短句的步驟和上一個短句相同。

回顧:不斷回顧重點細節

對於一個一下子難以看懂的描述,建議先做一個標記,比如問號,看完後再對這些打問號的地方重新審視,可以寫一些對這些地方的理解。

形象和抽象:將形象的問題抽象,對抽象的問題形象

對於一個形象的問題,我們往往需要對其進行抽象,進行數學建模;而對於一個過於抽象的問題(比如CTSC2009 day1 sequence),我們則需要進行形象的思維。

建議將這些經過分析的東西寫在題目描述的旁邊或者後面。

比如對於上面提到的例項2中的那句被大家忽略的描述,就可以如此標記:(1)首先,將租借給客戶(a)數量最多的策略最為候選,將所有的公司按照他們(b)發出請求的順序編號(2)對於候選策略,將策略中的每家公司的(c)編號(d)升序排列。(3)最後選出其中字典序最小的候選策略作為最終的策略。{這裡要排兩次序,問題的關鍵是如何處理第二次排序的最優性問題!}

不難發現,如果嚴格按照上述方法進行標記,是不會漏掉這一個條件的,或許這會浪費一些時間,但是挽回的損失是巨大的。

1.3把握尺度

那是不是把試卷寫的越滿就越好呢?筆者觀點是否定的。

要標記,但是也不是要讓所有記號將白色的考卷染成黑色;同樣的,考卷也不是草稿紙,筆者認為,過分的標記只會讓紙面變得混亂不堪,反而影響閱讀,同樣也過於形式。

標記法的目的是為了加深對題目的印象,做到一次審題效率最大化,是審題的輔助,並不是一個形式化的東西。

使得自己恰好完全理解,使得自己不會遺漏條件,不會主觀臆斷。這是使用標記法的原因,也是自己把握的尺度。適當即可,一切是為了向遺憾說再見。


2、思考

【建議2】審題之後,對每一道題目都應該進行較為深入的思考。建議進行20~30分鐘左右的思考,同時不可淺嘗輒止,讀過便罷。

2.1重要性

這裡的思考並不是指如何分析一道題目或建立數學模型之類,這不是本文討論範圍。

而除此之外,思考還能有什麼門道呢?答案是肯定的。

【例項3CTSC2009 day2

CTSC2009day2 有傳統題worldgarden,以及提交答案題puzzle

puzzle是經典的N2數碼問題。worldgarden筆者第一眼都沒有想到很直接的做法,而puzzle則應該是手動做一些模擬之後利用A*搜尋解答。

於是筆者花了幾乎所有的時間做了提交答案題,而幾乎沒有怎麼做另外兩道題,最後此題拿到45——而這確實是一個比較不錯的分數。

但是事實上除puzzle之外的兩道題,現場都有很多的滿分和高分,而puzzle的現場最高分不過是一個70分,絕大多數的人都是20~30左右。

筆者除puzzle外,僅得10分。

筆者用自己慘痛的經歷說明了思考的重要性。

很多時候很多簡單的題目往往套著複雜的外衣,而複雜的題目則往往有著簡單的表象,還有的時候,有一些題需要一些分析才能得到問題的本質,如果貿然跳過,則永遠會覺得此題讓人一頭霧水,進而影響到了考場上策略的安排。

可以說對每道題目都進行一定程度的思考,是考場策略正確實施的重要環節,也是重要保證。

摸清楚題目的脈路,是一切的基礎。

對於例項3中的情況,筆者犯的最大的錯誤就是根據以往的經驗,主觀的認為CTSC的傳統題都是基本不可做的,加之world一題有著非常抽象冗長的描述,再由於N2數碼問題過於經典,所以筆者武斷的認為這次傳統題都不可做,最後犯了嚴重的策略錯誤。

顯然,如果能夠每道題都仔細思考一番,就能發現world一題搜尋的本質,也就不會發生如此的遺憾。

2.2冷靜的判斷

上文說道,思考需要仔細。而何為仔細?是否想到演算法就可以了呢?也不是,想到了一個演算法並不能直接予以肯定,而是要先否定他,想想有什麼漏洞,或者想想是否有更好的方法,莽撞的立刻動手寫題往往會浪費更多的時間。

【例項4NOI2007 day2

NOI2007day2有一道令人記憶深刻的資料結構題necklace,此題標準做法是線段樹。而更容易想到的是,對於這種連續區間問題有著超強適應能力的splay

考場上吳卓傑在思考的過程中很快想到了利用splay解決這個問題,並迅速開始了編碼。最終利用3個小時,終於寫出了一個350行的正確程式碼。

但是由於時間的過多使用,導致另外兩道題的時間不夠用,而這道資料結構題,由於專注於splay,並沒有再深入的思考而沒有意識到可以使用更加簡單和快速的線段樹,導致最終此題也因超時的緣故僅僅比樸素演算法多了10分。

day2的成績最終導致吳卓傑和金牌差之毫釐。 

試想,如果能在考場上對另外兩題多思考一下,進行正確的評估和定位,並對已有的算法多進行審視,懷疑和分析,結果也許就會好的多了。

冷靜和深入是思考的要求。


3、做題

這裡的做題也並不是說如何寫程式,如何實現模型,這些不是本文討論內容。這裡的做題主要討論的是用什麼順序做題,用什麼的心理期望來做題,如何分配時間來做題。

3.1先易後難

現在的題目普遍有比較多的部分分可以拿,而很多的時候即使想出完美演算法,實現這些完美演算法未必在考試時間內能夠完成,那是應該節約時間拿到一些部分分,還是花時間思考和實現完美演算法呢?對於難度相當的兩道題,是應該先做哪一道呢?這是一個值得琢磨的問題。

【例項5CTSC2009 day1

CTSC2009day1一共三道題目,分別是傳統題triquesequence,和提交答案題locate trique是類似漢諾塔類的最優值問題,sequence是複雜的動態規劃(貪心)trique20%的分數非常簡單,sequence30%的小資料,locate有一個數據是求帶權中位數。

金斌在考試中選擇了先做trique,並用很短的時間寫了一個暴力程式對自己的程式進行檢測,但是發現小問題不斷,於是便進行不斷的改進,最終思考3個多小時也未能得出正確結論。慌亂之中,隨手寫了剩下兩題的小資料。最終只有trique得到50分,其餘兩道均0分。

相對於金斌,毛傑明在考試中一開始便寫了trique20%的送分資料,以及sequence 30%的小資料,並花了較多的時間利用調整做提交答案題locate最終得分是30+60+30,毛傑明沒有一道題的得分進入前十,但是總排名卻在前十之列。

CTSC2009是一次非常經典比賽,可以說這次比賽對選手策略的運用提出了很高的要求。從上面不難看出,對於一次考試的題目,絕對不能一開始盯著一道題花大量的時間。對於花很多時間先做難題,如果做不出(如例項5中金斌),則必然對心情是一種極大的打擊,非常容易影響考試狀態,而即使做出了(例項4NOI2007day2吳卓傑的表現),也會因為時間上的緊張影響到其他題目的解答。

【建議3】合理安排順序,遵循4個字:先易後難。這句話說的輕巧,如果分辨題目是難還是易呢?所以說先一步進行一定深度的思考是合理制定考場策略的前提。在進行一定思考之後,應該對不同的題目不同規模和性質的資料進行解題時間的評估。

【建議4】經過合理的預估,對於明確估計能夠在半個小時之內編寫完畢並且除錯成功的題目(或者題目對應的部分資料),應該立刻將其完成。

對於自己並不自信能在半個小時之內寫出對付一道題目的部分資料的正確程式,那麼樣的部分資料就不應該定義為簡單了。

寫完了簡單的,再寫有一些初步的演算法需要繼續思考,或者需要大量程式設計量的題目。

此時,有人便會提出疑議,會不會因寫簡單程式而佔用了寫出得分更多演算法的程式能夠用時間?

其實這是不會的,原因有二

第一點,是這裡的簡單是在充分的自信下定義的。在考試開始的時候,如果能夠正確而快速的寫出一個能夠得分的程式,不但是對自信的提高,也是讓自己更好的進入考試狀態;

第二點,如果一道題目,最簡單直接的拿基礎分的程式都需要比較長的時間,那麼此題必然是一個比較難的題。通過上面的討論我們知道,這種比較難的題不宜在一開始做,而應放在後面做。如果開始時間緊張,寫暴力程式也是避免出現意外,避免出現最後得較多分的程式未能成功寫出而拿不到分的情況。

3.2杜絕模稜兩可

很多人又要說,如果對於一種演算法,並不能通過題目得知具體的得分情況,該如何處理?

這種情況顯然是普遍的,很多人由於嫌惡暴力演算法得分不高,不願意觸及,而更願意相信一些通過靈感的來的演算法(比如一些詭異貪心)實際情況是怎麼樣的呢?

【例項6NOI2006

這次 NOI 我只有兩題接近滿分。一道是平衡樹的題目(90),一道是提交答案題(92)。其他的題目我接近0分。有些題目會告訴你百分之多少的測試點的規模是多少,小的規模的程式也許會很容易編,但是隻能拿一點分,比如40 分,抓住這點分!只要我能夠抓住這 40 分,我就可以進國家集訓隊了,我就可以拿NOI 金牌了!可是,當時的我,想了一個可以對付所有資料的貪心演算法(所謂對付,就是說可以不超空間和時間地出解),這樣得分的機率是很小的,小到遠遠不到 40%,我就拿了!這次NOI,我能拿這樣的 40 分的機會,我錯過了 2 !”  ——摘自陳明騁NOI2006總結

相關推薦

NOIP複賽複習怎樣才能高分

摘要 考場策略和程式測試是資訊學競賽中非常重要的環節,很多優秀的選手在很多比賽中總是會在這兩個環節上犯下這樣和那樣的錯誤,導致得到的分數和實力不成正比,最後留下了無盡的遺憾。本文將探討一些這兩個環節上值得注意的地方,提出一些可行的方法,分享一些經驗,以此希望幫助選手們在比賽中發揮水平,減少失

NOIP複賽複習動態規劃鞏固與提高

經典例題:數字金字塔(Luogu 1216)  寫一個程式來查詢從最高點到底部任意處結束的路徑,使路徑經過數字的和最大。每一步可以走到左下方的點也可以到達右下方的點。 我們現在這裡討論搜尋如何實現:  狀態:目前在第x行第y列 

NOIP複賽複習字串演算法鞏固與提高

一、Trie樹   1.定義: 通過字串建成一棵樹,這棵樹的節點個數一定是最少的。例如:4個字串"ab","abc","bd","dda"對應的trie樹如下: 其中紅色節點表示存在一個字串是以這個點結尾的。  一個性質:在樹上,兩個點u,

NOIP複賽複習數論演算法鞏固與提高

一、數論    1.數   整數、自然數(大於等於0的整數)、正整數(大於0的整數)、負整數、非負整數、非正整數、非零整數、奇數偶數。   2.整除性   設a,b∈Z,如果存在c∈Z並且a=bc,則

NOIP複賽複習基礎演算法鞏固與提高

一、倍增演算法:   定義:用f[i][j]表示從i位置出發的2j個位置的資訊綜合(狀態) 一個小小的問題:為什麼是2j而不是3j,5j,…?因為,假設為kj,整個演算法的時間複雜度為(k-1)logk,當k=2時,時間複雜度最小。 這個演算法的三個應用:

NOIP複賽複習十三圖論演算法鞏固與提高

一、圖的儲存   1、鄰接矩陣   假設有n個節點,建立一個n×n的矩陣,第i號節點能到達第j號節點就將[i][j]標記為1(有權值標記為權值),  樣例如下圖:   /*無向圖,無權值*/ i

NOIP複賽複習如何設計測試資料?

有些同學參加一次資訊學比賽之後,自我感覺非常不錯,但是測評結果成績卻並不理想。造成這種情況的原因有多方面,但是我認為其中不可忽視的一大原因就是在寫完程式之後,他們並不知道如何保證程式的正確性。在這裡,我就這個問題提出一點自己的看法。 先從考試的時間分配問題講起。很多同學覺得考試時間很充分,N

NOIP複賽複習STL演算法與樹結構模板

STL演算法 STL 演算法是一些模板函式,提供了相當多的有用演算法和操作,從簡單如for_each(遍歷)到複雜如stable_sort(穩定排序),標頭檔案是:#include <algorithm>。常用STL 演算法庫包括:sort快速排序演算法、二分

NOIP複賽複習STL容器與字串模板

STL容器 STL 容器是一些模板類,提供了多種組織資料的常用方法。常用的STL容器包括pair(組合)、list(列表,類似於連結串列)、vector(向量,類似於陣列)、priority_queue(優先佇列)、set(集合)、map(對映)、stack(棧)等,通過模板的引數

NOIP複賽複習演算法分析與排序模板

演算法分析 演算法分析的目的是預測演算法所需的資源,如計算時間(CPU 消耗)、記憶體空間(RAM 消耗)、通訊時間(頻寬消耗)等,以及預測演算法的執行時間,即在給定輸入規模時,所執行的基本運算元量,或者稱為演算法複雜度。 演算法的執行時間取決於輸入的資料特徵,輸入

NOIP複賽複習程式對拍與圖論模板

程式對拍 所謂“對拍”,顧名思義,就是讓兩者相互比對。所謂“兩者”,一是你要測試的程式,二是一個答案在該程式在一定範圍(時間/空間)內結果必定正確的程式(一般是用暴力求解的程式)。對拍一般需要造資料程式(data.exe),保證正確性的暴力對拍程式(test.exe)與測試程式(以moo.e

NOIP複賽複習讀寫外掛與高精度模板

讀入輸出掛 讀入輸出掛就是逐個字元地讀入資料,從而讓讀入更加快速。輸出掛的原理也是一樣的,都是通過將輸出數字變成輸出字元以加快速度。當然輸入輸出外掛一般用在大量輸入輸出的情況下,這樣價效比才高一些,否則得不償失。 void Rd(int &res){  &nbs

NOIP複賽複習檔案讀寫與數論模板

檔案讀入讀出 假設題目名為“add”,那麼資料夾名為“add”,c++程式名為“add.cpp”,讀入檔名為“add.in”,輸出檔名為“add.out”。四個的拼寫均不可有誤,包括大小寫差異。千萬不要除錯後就忘記修改檔案讀入讀出了。  #include<cstdio&

NOIP複賽複習競賽環境與注意事項

一、比賽不提供紙質試題,只提供電子版試題檔案。 該檔案壓縮包儲存在計算機桌面上。監考人公佈密碼後,選手自行解密試題。 試題解壓密碼會影響一個人的心情,一定要一次輸對,注意大小寫,不要邊輸入邊檢查,要對自己有自信。 二、江蘇複賽選手上機可自選windows或linux作業系統。

NOIP複賽複習常見問題與常用策略

數學類問題 1. 精度處理(高精度、實數處理、各種浮點型別處理方法) 2. 組合數學問題(斐波那契數列、第二類數、卡特蘭數、Polya原理、排列組合計數、加法原理與乘法原理) 3. 進位制問題(特定二進位制串的統計、二分查詢、利用二進位制進行路徑、狀

Java基礎知識複習-- 二叉樹排序

二叉樹 二叉樹由各種節點組成 二叉樹特點: 每個節點都可以有左子節點,右子節點 每一個節點都有一個值 二叉樹排序 假設通過二叉樹對如下10個隨機數進行排序 67,7,30,73,10,0,78,81,10,74 排序的第一個步驟是把資料插入到該二叉樹中,

NOIP專題複習 狀壓DP學習筆記

其實並不是三,已經走了很多專題了。 之後慢慢填坑吧。 我覺得學普通的DP已經救不了我了。 發覺似乎NOIP狀壓蠻裸的(flag立的飛起),於是學一波。 其實在下作為一隻蒟蒻,認為狀壓DP屬於很好理解但不太好寫的型別。 還是從經典例題互不侵犯開始。

資訊系統專案管理師高項論文這樣寫才能高分

資訊系統專案管理師論文結構要合理,要包含論點、論據和論證幾大部分,注意語言要流暢,做到首尾呼應。 這裡為大家整理了資訊系統專案管理師論文寫作要點,供大家參考。 1、根據題目要求確定論述內容及文章結構。要用論文的寫作方式展開論述,即要有論點、論據和論證步驟,同時做到首尾呼應。 2、寫摘

【蒻爆了的NOIP系列--普及組複賽6NOIP2015普及組複賽題解

這只是一個作業,如果有幫到您的,我只能說。。。這不科學。。。 ————————————華麗的分割線———————————— 第一題: 這題很水雙重for列舉直n次輸出當然你要數論我也沒辦法

資料結構複習之平衡二叉樹及哈夫曼樹

平衡二叉樹需要保證在插入和刪除二叉樹結點時,任意結點的左、右子樹的高度差絕對值不超過1,所以平衡二叉樹或者為一棵空樹,或者為具有左子樹和右子樹都為平衡二叉樹的性質。插入和刪除時出現不滿足條件時可進行一定的調整,分為LL平衡旋轉、RR平衡旋轉、LR平衡旋轉、RL平衡杆旋轉。