新手如何參加信息學競賽NOIP,怎麼入門?

題主今年高一新生,在浙江這邊的一所很普通的重點高中混日子。初三的時候接觸的編程,當初只是感覺好奇,喜歡,然後想要玩,就自己找了書來看的,因為是抽的課餘看,也沒有專門學習過,所以可能基礎知識也很有限,那時候看的是C Primer PLUS,看了大概半本左右,然後也基本上沒寫過太多稍微有點長的程序的那種好像至今為止。

我是從來沒有聽說過OI的在這之前,當初就是為了玩編程學的這個,前幾天拿到一張就是學校里的NOIP的邀請函什麼的吧,大概就是去看一下學什麼之類的,然後這周過來找這些。請求幫助。

我原來的打算是高中自己抽課餘的會把C語言大致的學完,也是前段時間剛聽說的單片機和嵌入式,想做一名這方面的愛好者吧,是這個打算。我們浙江這邊現在是改革了的高考,好像什麼成績都要靠三位一體啊之類的加分。所以拿到那個以後想試試就是從頭入門學OI提高組什麼的,有沒有可能拿獎之類的,

或者其實編程這方面我一直也沒有真的搞明白多少,一直都是自己看看書之類的,不知道和系統的學習,完整的一個體系,就是和他們那些學過的人相比有什麼區別。相借這個機會好好鞏固一下,學一些實用的東西。


TOP:這裡有NOIP歷年真題,推薦大家看看《神犇幫你分析NOIP歷年考點 - 編程少年》

下文是NOIP吧吧友(賬號:lm40015410)對個人NOIP 之旅的一個總結,主要針對初次參加NOIP的普及組新生。總結了去年的教訓,也參考了一部分神犇的資料,希望能給各位新生們一個參考。

-----原貼鏈接:【分享】獻給各位初次參加noip的新生們--個人經驗分享_noip吧_百度貼吧

距離NOIP2017還有三個多月的時間,這幾個月可以干很多事,這也就是我接下來要說的。送給大家一個公式:競賽成績=實力x經驗 給大家解釋一下這個公式。我有一個同學,可以算是神犇級別的了吧。他的競賽實力相當牛b,單源、DP什麼的偽代碼能輕鬆默下來,紅黑樹、博弈論甚至FFT都能講得頭頭是道,而且僅僅是一名初二學生!

去年他參加了NOIP普及組的比賽,結果出人意料——只有第一題分解質數(好像叫這個名吧...)得了10分,其他題全部爆0。事實上,他所有題都做了,但是他是抱著AK的心來的,所有的題他都是只過了樣例就去做下一道了。你們也知道的,CCF的樣例向來都很弱,尤其是去年...他競賽實力弱嗎?一點不弱,他是我們那個考場唯一一個文化之旅寫了SPFA這個正確演算法的人。但是,很可惜,由於某變數忘記置0導致爆0,考試結束的時候甚至連樣例都沒試。

第一題,一個邏輯錯誤;第二題,某情況下變數加不+1但是沒考慮;第三題,強行按照自然數拆分的辦法寫的DFS;這些錯誤很小,但是這千里之堤就毀於小小的蟻穴了!他的競賽實力很強,但是做題經驗幾乎為0,他幾乎所有的時間都用在了研究演算法上,很少做題。

我相信看我這篇文章的同學裡也有類似,一段代碼出來,大的框架沒有問題,就是WA(1),後來抓耳撓腮找了幾個小時才發現就是諸如變數初值,變數置零,遞歸形參、局部全局變數用錯這樣的小問題。實不相瞞,我直到現在依然如此。為什麼?答案很簡單,做題少了!做的題多了,錯誤出得多了,也就有經驗了,熟能生巧嘛!

拿到一道題,有經驗的人會先按照人類處理該問題的思維去構造一個數學模型,然後去掉不必要的模擬,找可行優化,選用合適的數據結構和演算法去實現,整個過程10多分鐘就好了,絕對比你邊寫邊想演算法犯了邏輯錯誤去查幾個小時要划算!

呵呵,說的偏了,但都是大實話。前言的最後送給大家幾句話:

不要好高騖遠,即使是大神的第一次也不會順風順水;

不要掉以輕心,即使是NOI也有忘記刪調試輸出、變數打反、沒用文件這樣錯誤的人;

不要垂頭喪氣,CLJ也是高三才拿到IOI冠軍!我們還年輕...

陳立傑(CLJ),1995年8月1日出生,現就讀於清華大學交叉信息學院。自2010年8月以來,多次在信息學奧賽(OI)中取得令人震驚的好成績,是OI界的奇蹟人物之一。

考場瞬息萬變,有不會做的題很正常。平心靜氣,先做簡單的題,如果一道你有正確演算法的題答案卻不對,很可能是小錯誤,不要輕易放棄做別的題,那樣可能會讓你直到考試結束一道題也沒做出來。

多做題,多思考,心要靜!

注釋:(1) OJ上的測試結果。

WA :wrong answer 錯誤的答案

AC:Accepted答案正確;通過

TLE:Time Limit Exceed 超時

OLE:Output Limit Exceed超過輸出限制

MLE:Memory Limit Exceed超內存

RE:Runtime Error運行時錯誤

PE:Presentation Error格式錯誤

CE:Compile Error無法編譯

初賽

初賽的考察內容的一部分是計算機的基礎知識,比如進位轉換,工作原理,演算法原理、歷史事件名人等。這些對於大部分第一次參加NOIP的同學來說應該比較陌生,這樣的知識只能通過平時的積累,從現在就開始搜索資料,有意識的去記憶。

另一部分是數學內容,包括排列、組合等大概高中的數學知識,需要下載資料去研習,背公式。

最後一部分是程序完成。如果說前面2部分還有補習的希望,最後這一部分完全是靠你的做題基礎,沒有捷徑,只能靠你平時多做題,對部分簡單演算法有些了解。

初賽形式為筆試,描述語言為C/C++或Pascal。各省市初試成績在本賽區前百分之十五的學生進入複賽,其分數不計入複賽的成績。初賽時間為10月的第三個星期六下午2:30 - 4:30舉行。

1、選擇題:共20題,每題1.5分,共30分。每題有4個備選答案。試題內容包括計算機基本組成與原理、計算機基本操作、信息科技與人類社會發展的關係等等。(普及組為20道單選題,提高組為10道單選題和10道不定項選擇題,不定項選擇題與答案完全一致才得分,多選或少選均不得分)

2、問題求解題:共2題,每題5分,共10分。試題給出一個敘述較為簡單的問題,要求學生對問題進行分析,找到一個合適的演算法,並推算出問題的解。答案以字元串方式給出,考生給出的答案與標準答案的字元串相同,則得分;否則不得分。

3、程序閱讀理解題:共4題,每題8分,共32分。題目給出一段程序(沒有關於程序功能的說明),有時也會給出程序的輸入,要求考生通過閱讀理解該段程序給出程序的輸出。輸出以字元串的形式給出,如果與標準答案一致,則得分;否則不得分。

4、程序完善題:共2題,第一題10分,共4空,每空2.5分;第二題18分,共6空,每空3分。兩題共28分。題目給出一段關於程序功能的文字說明,然後給出一段程序代碼,在代碼中略去了若干個語句並在這些位置給出空格,要求考生根據程序的功能說明和代碼的上下文,填出被略去的語句。填對的,則得分;否則不得分。

複賽:考前準備

草稿紙考試一般會發放,比較大,需要你帶一、兩支筆。應該可以帶水,但是別喝多了,貌似上廁所比較麻煩。考試這幾天就不要再學習新的東西了,時間不夠,學也學不精,反而是浪費時間。

建議自主複習一下舊的知識,比如字元串處理、快速排序這樣的知識。頭天晚上不要嗨到太晚(熬夜打DOTA、竄宿舍泡妹紙什麼的...),早點睡。

第二天大概6點左右就起床吧,剩下的時間根據需要調配,早飯、午飯大概8成飽就足夠了,考試前記得上個大號- -哦對了,參賽證千萬別丟了!建議快考試的時候再掛到脖子上(我們這有個仁兄把准考證弄丟了- -最後怎麼解決的不知道),平時別拿出來顯擺。

還有就是一般住宿的學校會給你學校的平面圖,考場在哪、食堂在哪、宿舍在哪一定研究明白了,別找不到地方就蛋疼了...

比賽提前30分鐘進場,熟悉考場環境,找到自己座位及廁所位置,更改軟體、系統為自己所喜歡的設置,如:取消桌面背景、更改屏幕解析度、更改虛擬內存等。利用熟悉考場時間寫下重要且易錯內容,如:快速排序(Qsort)、文件操作命令等。

試題解壓密碼會影響一個人的心情,一定要一次輸對,注意大小寫,不要邊輸入邊檢查,要對自己有自信。禁止攜帶U 盤、MP3、計算器、手機等任何與存儲、計算、通信有關的電子設備;禁止攜帶一切書籍和其他無關物品;一經發現按作弊處理。

還有,考前一定要看《騙分導論》!!!(註:這麼誤導小朋友不好吧!)

在Oier中,有一句話廣為流傳:任何蒟蒻必須經過大量的刷題練習才能成為大牛乃至於神牛。這就是著名的lzn定理。然而,我們這些蒟蒻們,沒有經過那麼多歷練,卻要和大牛們同場競技,我們該怎麼以弱勝強呢?答案就是:騙分。那麼,騙分是什麼呢?騙分就是用簡單的程序(比標準演算法簡單很多,保證蒟蒻能輕鬆搞定的程序),儘可能多得騙取分數。騙分是蒟蒻的有力武器,可以在比賽中騙得大量分數。但是,最後我還是要說一句:不騙分,是騙分的最高境界。

就這些吧...


考慮到你是高中生,肯定只能參加提高組的比賽了。

近年來NOIP題目有難度逐漸增加的趨勢,如果按照題主所說想要依靠NOIP在考大學時取得顯瘦,那麼至少需要省一的獎項。這樣的情況下題主可能需要花費大量的時間在競賽上,建議工程什麼的就別想了。

關於信息學競賽的入門和提高,其實無非就是掌握,熟練,會靈活使用。

對於基礎演算法和數據結構,建議題主可以買本書進行系統學習,例如《挑戰程序設計競賽》,《演算法競賽入門經典》等等。

然後輔以練習。

這是很花時間的事情,但題主如果堅持下來,相信可以收穫自己想要的結果。


oi跟工業差的還是蠻遠的……並不需要高深的編程知識……

目標是noip的話可以慢慢搞……考慮高三拿一個一等吧……

建議不要去看語言/計算機技術方面的知識,noip主要考演算法,這個時候應該去洛谷等oj刷題。

順便推薦一本《演算法競賽入門經典》。


潛水幾年首答。

利益相關:當年noip拿過全國一等,13年高中畢業,自招到某985,現在剛畢業入職某司嵌入式開發崗。答這題應該挺適合的。

準備noip總結可以分三段:

1、noip主要學的是演算法,與單片機和嵌入式關係不大,推薦去學c++(好像noip說即將要取消c語言了?),c primer plus或者c++ primer plus都挺好的,雖然說那個譚浩強的什麼老是被吐槽,但是作為入門還是挺好的,語法這些不需要深究最重要是會用,能描述出你想表達的演算法,若是時間緊也可以在學習演算法中鞏固語法的知識,我看你說看了一半c primer應該也差不多了。

2、然後就要學一些演算法知識了,我那時主要的演算法有:數學遞推、回溯、貪心、分治、搜索、動態規劃、樹、圖論,我那時候是有老師教的,大學時看《數據結構與演算法分析》感覺也基本覆蓋到了,這方面應該挺多書的很好找。 @BillXu2000 推薦的那本《演算法競賽入門經典》看了一下挺好的。

3、最後就是多刷題了,多看人家的解題報告,等到了一定境界後就會發現其實來來去去就那幾種題。我記得到高三我那個專門放代碼的文件夾已經有幾百M了,各種題庫,那時候時北大的那個oj挺出名的,還有各種模擬題,時間一定要掐好,我那個時候是3小時4題,(現在好像又改了)。

ps.如果還有對單片機與嵌入式有興趣的話,可以私聊我。


推薦一下自己的博客。

金企鵝

裡面大概記錄了自己刷的題,自己用了一年多的課餘時間,就拿到了省一等獎,省選名次進入省隊人數範圍內,所以說OI並不困難,只要有足夠天賦,和良好的團隊,就能取得不錯成績……


浙江的OIER。。那邊想拿一個提高一等難度也不算小啊。。在強省拿tg一等還是需要至少掌握好noip的所需演算法和基本知識。。關鍵是初賽得好好複習,別折在這上面。。。

祝你好運,蒟蒻留


瀉藥

自己在高中沒有搞OI,是大學又參加了ACM,你說你想搞OI,又對單片機感興趣,我先潑盆冷水,只能選一個,這裡邊水相當深,哪一個都需要大量時間堆積。

你有C語言基礎這是很好的,參加OI,考察你的演算法,思維,編程基礎,看CPP是不夠的,你需要再讀一本書鞏固下,還有純C選手非常吃虧,許多演算法需要自己現寫,一定要學c++,至少你要會用STL庫里的東西吧。

演算法書籍請買兩三本,劉佳汝大神的書啊,就是針對競賽的,所以推薦,然後再選一本容易看的,畢竟劉大神智商太高,許多問題默認我們會,我有時會一臉懵逼。

暫時想到這些,下邊說下單片機

單片機我聽了學校兩次課,然後果斷退坑。我認為玩單片機是一個燒錢的方向吧,而且水也很深,你學了C,其實是不夠的,樓上也對怎麼入手單片機說得很對,電路基礎,彙編,計算機原理,必不可少。對於針腳,介面,也需要對電路有很深的理解。

所以選哪一個看你自己興趣最終決定。


騙分過樣例,暴力出奇蹟


首先聲明,我是一個高一的OIer,有的東西只是自己的感受,大家不要太計較啦

我是從初一下學期開始學習的,現在也是將近三個整年了。

基礎的東西一定不能忘,NOIP2015是我第一次參加NOIP,當時稀里糊塗的過了初賽,複賽之前掌握的東西真的很少,複賽前一天我才學到高精度計算。那時候用的是Pascal,學習數組的時候因為比較趕,所以沒大練習,頂多是能比較基礎地使用一維數組。結果,相信大家都記得,NOIP2015普及第二題,掃雷,需要開二維數組。當時我一看這道題就懵了,完全想不起來二維數組怎麼開了,怎麼調試也過不了,最後,普及二等。

其實,還是我太弱了,畢竟這麼基礎的東西怎麼能忘掉呢。

NOIP2016的時候,初三,那時候數據結構只是學了點基礎,但對於普及組來說也足夠了。複賽的時候,可以說是基本沒用到數據結構和演算法,最多就是第三題用了一個桶排序,前兩題全部暴力模擬,但是當時模擬打的比較穩,所以前兩題AC。結果,NOIP2016普及一等。

所以說,最基本的暴力模擬也是一定要熟練的,畢竟很多時候正解是很難想出來的,這時如果你的暴力打的穩,並且優化的好的話,只要數據不是很大或者很坑,也是能拿到不少分的。

其實,歸根結底,還是要努力學啊,如果你能把考點內容全都掌握的很熟練,那還用什麼暴力模擬呢?隨手一打那就是550+啊。如果心態好、精神充足的話,AK也是有可能哦。當然,那需要很紮實的知識基礎和豐富的經驗了。

還有,我覺得一個好的學習氛圍是很重要的。如果你有很好的教練團隊或者水平很高的同學的話,氛圍肯定是不一樣的。在這種氛圍下,只要你能認真努力,我想就算想學不好也很難吧。

最後,祝大家能在NOIP2017 RP++,取得一個滿意的成績。也祝題主能在OI的道路上越走越遠,堅持自己的初心,為愛好而奮鬥吧。

最後,小透明來推薦一下自己的網站啦 王小宇 https://www.wanghaoyu.faith

歡迎各位神犇提供你們的網站哦,互相交換鏈接吧


你們浙江是競賽強省,我接觸的你們浙江的好多dalao都是從小學或者初中就開始進行專業化的訓練了,你起步比較晚,所以你的壓力還是很大的。noip主要考演算法,也就是怎麼用最短的時間,最高的效率,最小的內存來完成題目,語言部分知道一些基本的語法,也差不多了。所以你之前接觸到的一些單片機什麼的其實對你參加noip只是一個基礎的作用,你要學演算法,演算法是核心。另外我建議你用c++吧,用到後面stl很方便,而且noip里你用c會有一些不明顯的錯誤難找出來(我第一次參加初賽就被c語言里的幾個逗號坑了),c++和c基本差不多,但c++是主流。推薦&<信息學奧賽一本通 第四版&>和&<演算法競賽入門經典&>這兩本書用的人比較多,口碑也不錯。

還有樓主啊,你數學要好哦,學演算法數學要求很高,總之加油吧!


學習演算法,網上書很多,不一一介紹了,你也可以看看破乎上其他人的推薦

去各種oj刷題,比如西班牙的UVa,這算是資歷最老的競賽oj了

如果可能的話把語言換成c++,並不是說c不重要,而是c在演算法競賽中太吃虧了(因為很底層)總之。。acm選手用的幾乎是c++或者java。。


浙江啊,那有點麻煩。。。

本人JS的,經常性的上網刷題中,會接觸到各路浙江大神的故事。。。

上述都是廢話?

想要提高組有一個比較好的成績,在ZJ至少300+省一(所以說變態的呢,JS200+)

我只好說,搜索什麼的是必須閉著眼睛都能打出來的東西。

圖論要至少會騙分的FLOYD。。。迪氏演算法,貝氏演算法也得會。

要求很多,因為省二很容易(本人今年極炸,但是省二還是有的),但省二沒有多大用處。

所以洛谷賬號準備好吧,要在浙江拿競賽的好獎,真的不容易。

尤其是信息學。


推薦閱讀:

NOIP提高組一般會考察哪些內容?
搞oi不停課有希望達到noi銀牌以上水平嗎?
如何評價安師大附中吳作凡?
如何評價NOIP2017複賽成績公布CCF連續跳票?
如何評價洛谷冬日繪版?

TAG:C編程語言 | OI | NOIP | 自學編程 | 信息學競賽 |