考場策略和程序測試是信息學競賽中非常重要的環節,很多優秀的選手在很多比賽中總是會在這兩個環節上犯下這樣和那樣的錯誤,導致得到的分數和實力不成正比,最後留下了無盡的遺憾。我們收集和整理了一些值得家長和考生注意的地方,提出一些可行的方法,分享一些經驗,以此希望幫助考生在比賽中發揮水平,減少失誤,告別遺憾。
整體規劃
一場信息學競賽,比賽時間都是好幾個小時,連續做幾道大題。在這樣的一個長時間「燒腦」的過程裡,考生如何分配時間,如何對待考試的題目,用什麼方式和順序對待題目等等一系列的決策問題,都需要一個考場策略來幫助考生獲得更好的成績。
整個答題策略可分為這幾步:
讀題->分析題意->找出算法->編寫程序->手動測試:樣例、自測數據->文件測試:與樣例對比。
5個注意點
(1)瀏覽試題,閱讀並分析。
(2)先易後難,每完成一題要調試好、保存好。
(3)容易題要保證測試數據全過,難的問題儘可能取得一些邊界分數。
(4)閱讀要仔細,分析要全面,可藉助圖示等方法理解題意。
(5)注意數組是否越界!全局變量與局部變量儘量不相同。遞歸有層次限制,最多層數與程序大小、電腦配置有關。考慮特殊情況和極限情況。注意經常保存文件!
10大考場策略
策略1:認真審題
這一點非常重要,一旦審題錯誤或者理解錯誤就可能造成你花很多時間寫出來的程序 WA。如果沒有思路,可以嘗試著多讀幾次題目。
很多考生覺得這花去的時間太多了,大大佔用了之後的解題時間。但是無數的事實告訴了我們審題的重要性,無數的遺憾正是由審題開始的。
策略2:考慮嚴謹
如果考慮不嚴謹就可能被特殊數據卡分[0,100]而特殊數據往往分為極端數據和特殊數據。極端數據會按數據最大範圍來,所以要注意空間是否足夠,int 是否會溢出;數組的大小是否合適。特殊數據往往是具有特殊情況或性質的數據往往需要特判。
策略3:關於時空複雜度
通常 1s 運行時間最放心的時間複雜度為 1e6, 時間複雜度為 1e7 時儘量降低代碼常數,時間複雜度為 1e8 時儘量不冒險。
查詢空間複雜度可用 sizeof 函數。
sizeof(T)返回存儲一個類型 T 的對象所需要的字節數。
sizeof(數組)可得數組所佔的字節數大數組開全局變量。
策略4:關於文件讀寫
freopen文件輸入輸出是非常重要的一部分,一旦寫錯一點,就會丟掉該題的全部分數先按照平時流程完成代碼,確認代碼無誤且沒有輸出多餘的調試語句後,再加上文件輸入輸出以及頭文件,再次編譯,編譯無誤時則可認為完成該題。
策略5:重檢查
即使金牌選手也可能會犯低級的錯誤,在重大的比賽中要告別遺憾,必須重視檢查這一環節。
每道題目都要檢查,我們推薦寫完立刻檢查,因為此時的印象最深刻,效果最好,同時檢查完畢後就排出了這倒題目對後面比賽的影響,更容易讓人在後面的時間裡面集中精力。
考試過程中要巧用對拍檢查,還有注意檢查你的程序是否在考試指定文件夾裡面,名稱是否正確,尤其是.cpp/.in/.out 的名稱。
策略6:關於頭文件和考試平臺
萬能頭文件:#include<bits/stdc++.h>
若在考前不能確定是否能用萬能頭文件(一般是可以使用的),請使用以下的常用頭文件:
#include<iostream>
#include<iomanip>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<list>
#include<set>
#include<stack>
#include<vector>
#include<deque>
#include<map>
#include<cstdlib>
由於評測環境是在 linux 平臺下,切記不要使用 linux 平臺沒有的頭文件,如
#include<windows.h>。
一些英文變量的命名可能與 linux 平臺下的關鍵字衝突,但在 windows 平臺下可以編譯通過,如 time 等,使用英文變量名最好首字母大寫。
不能使用的變量名:dfs、next、search、index、pow(冪函數)、min、max、y1、x0、link、map、pipe,ws。
策略7:先易後難
現在的題目普遍會有部分分可以拿,而很多的時候即使想出完美算法,實現這些完美算法未必在考試時間內能夠完成,所以這時候就應該根據考場的情況,比如時間,難度,剩餘題目的數量來判斷是應該節約時間拿到一些部分分,還是花時間思考和實現完美算法。
策略8:冷靜判斷
想到了一個算法並不能直接予以肯定,而是要先否定他,想想有什麼漏洞,或者想想是否有更好的方法,莽撞的立刻動手寫題往往會浪費更多的時間。
策略9:暴力出奇蹟
當想不出來正解的時候,根據數據範圍分段寫暴力、騙分。可用 namespace 封裝幾個分段的做法,避免變量命名重複以引起衝突。遇到高精度的題目,先寫低精度,再寫高精度,並用低精度做對拍。任何題不管有沒有思路,都可以寫出最簡單的暴力做法騙分(一眼能夠看出怎麼做的題除外),有時間再逐步思考正解。
策略10:最後10分鐘
在考試的最後10分鐘時間裡,我們建議不要再寫程序,此時此刻考生在考場上能想到的和應該拿到的分數基本已經定型,這時候選手應該核對檢查是否注釋了改注釋的東西,文件名是否寫對,特別要檢查有沒有多餘的空格,文件夾是否建對等基本的東西,防止考生最後因為這些基本的事情沒做好出現零分,每年基本都有考試因為不注意這些事情而發生「爆0」的悲劇。
考生最後10分鐘檢查核對參考:
(1)核對所有代碼的文件名是否按照考試要求。
(2)freopen()裡的文件名是否寫對。
(3)中間計算結果是否超 int。
(4)long long 類型輸入(scanf)、輸出(printf)是否是用了「%lld」。
(5)調試語句是否刪除或屏蔽。
(6)分塊是否有錯。
(7)是否需要高精度。
(8)自己的輸出結果是否和題目要求的一樣,注意是一模一樣,包括大小寫!比如題目要求輸出「Yes」而你寫的是「yes」,那麼你的程序就算錯的!
(9)原始碼存放的目錄路徑是否安裝考試要求存放。
(10)是否交錯文件,有沒有自己錯誤的多建了文件夾。