程式筆記 第五期 你好,NOIP

2021-08-10 15:35:29 字數 3788 閱讀 3737

解釋一下:

這篇 blog 不是我自發地要寫的,因此可能會有點水,不要在意……

老師讓程式設計社的全體學員在這noip的暴風雨來臨之前的寧靜中寫下了這一篇blog,就這樣,數篇世界級的水部落格誕生了!

然後再說一下,本來這篇 blog 是準備在noip開始之前寫好給自己打打底氣的,不過現在看來好像沒有什麼用了(已經考完了)。

學了這麼久的 c++ ,不禁想到——自己都學了些啥?noip 要來了,這是作者迎接的第一場正式競賽(新手上路,多多包涵),總應該有些準備吧。

c++?演算法?

(1) stl 容器的那些事

① vector<>

動態陣列——這是乙個非常有用的容器,通常我們為了不訪問到陣列未定義到的位置,會把陣列定義得大一些。看著這麼多記憶體白白浪費掉,有些心疼……所以這就是第乙個 stl 容器,能夠隨時改變自己占用的空間大小。它是可以用sort排序的,用法是:sort(vec.begin(),vec.end()); //vec是動態陣列的名字

但是最有用的是它能夠「套」著用——vector< /*變數型別*/ >本身就作為乙個變數名使用,所以能夠這樣套——vector>,相當於乙個二維陣列(注意最後的2個 『>』 要分開寫 ,不然會被 c++ 認為是 「>>」)。

② map<>

關聯式容器——這個容器能讓自己的**更加清晰,儘管速度有些慢……它可以以任意變數型別(這裡不包含stl容器)為下標,然後你就會發現它能處理負數(︿( ̄︶ ̄)︿)。

③ set<>

這玩意很少用,但是還是提一下——集合,和數學的集合一樣。它的元素型別必須是乙個定義了 『

④ queue<>

這應該是我學的第乙個容器了——首次應用在廣度優先搜尋中。比模擬佇列要方便得多——不擔心訪問越界。模板在這裡:

while(!que.empty()) //佇列不空

que.pop();

}

⑤ priority_queue<>

優先佇列——圖論演算法之一spfa。維護陣列專用((~ ̄▽ ̄)~),分有大根堆和小根堆,但是過載的都是 『

//比如自定義的變數型別名是bin,比較其中f變數的大小

/*大根堆*/

bool

operator

(2) 我覺得要考的演算法

①二分查詢

這是乙個速度為 o(n logn) 的演算法,但是它必須是在乙個按一定條件有序排列的陣列裡查詢——定義左右邊界,範圍只能大,但是不能小(最好是剛包含所有的查詢範圍)。一般來說左右邊界都是int(如果是其他型別,則需要按照精度要求調整),模板放這裡:

while(left+f/*f是精度*/

/*變數型別*/ mid=(left+right)/2;

if(check(mid)) //建議把判斷寫作check()函式

left=mid;

else

right=mid;

}

關鍵是check()函式,如果不知道什麼時候壓縮右邊界,什麼時候壓縮左邊界的話——就都試一下吧。自己出一下資料吧,一般來說都是找得到錯誤的——如果與你的答案與正確答案不一樣,把 left 和 right 的位置換一下,再試一次——還不對,就是check()整個都寫錯了(如果正確就恭喜啦(^-^)v)。

@有這麼一道題:膨脹的木棍(這根木棍很膨脹)

②深度優先搜尋

暴力搜尋——「暴力出奇蹟」。如果是正確的做法的話可能會要求剪枝,最簡單的一種剪枝的方法是判斷用bool陣列判斷重複。除去這一點——可以用記憶化搜尋,這樣就比較像 動態規劃(應該考不到這麼難吧) 了。

③動態規劃

最後恐怕就是dp了(⁽⁽ଘ( ˊᵕˋ )ଓ⁾⁾*),一般來說是用記憶化搜尋。要從狀態入手,主要有揹包問題區間dp。揹包問題的狀態是 g[i][j] 表示:前用前i個物品填補剩餘的容量j所得的最大價值;區間dp的狀態 g[i][j] 表示:從 i到j的區間內的最大價值

(1)對拍不用手點- .bat檔案

先建立乙個記事本,然後打上這個模板:

@echo off //不顯示執行資訊

:loop

資料生成器的exe檔案》資料儲存處 //生成資料(標準輸出)

我的exe檔案《資料儲存處》我的程式輸出 //生成輸出(標準輸入輸出)

正解exe檔案《資料儲存處》正解輸出 //生成輸出(標準輸入輸出)

fc/a 我的程式輸出 正解輸出

if not errorlevel 1 goto loop //沒有錯誤->再次對拍

pause

goto loop //如果不需要找到錯誤後繼續找錯誤,就輸出

下列步驟:

我的電腦 -> (左上角)組織 -> 資料夾和搜尋選項 -> 檢視 -> 高階設定 -> 關閉「隱藏已知檔案的副檔名」

然後把你寫的記事本的「.txt」副檔名改為「.bat」就行了。

(2)資料生成器

直接上 blog-隨機資料生成器

(1)準備要充分

一進考場,試機完畢後,趁考試沒開始,打上頭檔案(「cstdio」、「algorithm」、「iostream」、「cstring」都打上吧)。還有每個程式框架——一般來說加上乙個 freopen :

#include

#include

#include

using

namespace

std;

int main()

把這些必要的框架打完,複製到4個cpp檔案(noip 4道題嘛)裡,心裡就有底了。

(2)時間很充裕,**不著急

noip的普及組初賽難度並不是非常高,而且時間還很長(3時30分),所以一來不要忙著把第一題和第二題刷了(雖然都是水題)。這裡有乙個小建議——先把所有4道題都看完,自己心裡有乙個目標,把每一道題自己的目標分數先定好,加乙個注釋打在每一道題的程式開頭,順便把自己覺得會怎麼錯的原因寫在旁邊(比如「棧空間**」什麼的)。接下來仔細讀題,分析每一道題主要考察的演算法,也寫在程式開頭。

不過注意一下**的位元組數,不要超過限制了。回首當年,某位大牛興高采烈地覺得自己能夠 ak ,結果…3、4題0分,原因是他把注釋寫得太多了!以至於評測軟體檢測到該程式過大,不予理睬,直接0分。漢字(包括中文字元)的位元組數是非常龐大的,這就是為什麼沒有乙個程式語言是以中文為基礎來編寫的原因!

(3)不會做就別做了

初賽真正拉分的題是第

三、四題,偶爾會有難度,是給真正的大牛表現自己的才能的題目。所以像我們這樣入門小白就還是不要太勉強。如果一道題寫了30分鐘都還比較亂,不如用「暴力搜尋」,正所謂「騙分過樣例,暴力出奇蹟」。

(4)別人做什麼和我什麼關係?

有一些學校會為了拉一些人數,強制一些本身能力不是特別強的學生參賽(還好作者的學校沒有)。因此在考試時發現自己附近的某位同學自暴自棄、不知所措是非常正常的。這時候我們需要堅定自我,不要自甘墮落(像前者一樣)。

如果你看到了這裡,真的十分感謝(ヽ( ̄▽ ̄)ノ)。畢竟這是一篇「水 blog」。相信對於不少同學,這次noip也是自己的第一次正式競賽。希望我的一些部落格能幫到大家(反正作者也考完了)。

noip涉及到的演算法——模擬;二分查詢;分治;搜尋(深度優先、廣度優先);貪心;動態規劃

thanks for reading!

-lucky_glass

第五期c語言答案

輸入兩個字串,從第一字串中刪除第二個字串中所有的字元,例如,輸入 they are students 和 aeiou 則刪除之後的第乙個字串變成 thy r studnts 編寫乙個函式,求乙個數字是否是回文數,回文數的概念 給定乙個數,這個數順讀和逆讀都是一樣的,例如 121,1221是回文數,1...

《收穫》 06年第五期 太糟了

這個週末把這一期的 收穫 2006年第五期,總第181期 看完了。最近幾期的內容糟糕透了。今年每一期 收穫 買回來,我基本是先看李輝的 封面中國 隨著敘事的時間線逐漸逼近 1949 年,李輝下筆也多有收攏,總有種言猶未盡的感覺。還好,這是 收穫 還值得看的乙個欄目。本期的長篇是 土豆網的王微 的 等...

資料科學訓練營第五期

課前預習 python基礎 實訓營學習經驗與捷徑 20180213.mp4 課前預習 雲平台使用 python基礎 20180213.mp4 第1講 google python指南與資料科學python高階 20180331.mp4 第2講 pandas series dataframe 20180...