1. 程式人生 > 其它 >CSP-J/S 第一輪知識點選講

CSP-J/S 第一輪知識點選講

CSP-J/S 第一輪知識點選講

NOIPNOIP(全國青少年資訊學奧林匹克競賽)於2019年取消。取而代之的是由CCFCCF推出的非專業級軟體能力認證,也就是現在的CSPJ/SCSP−J/S。作為一名於2019年1月入OIOI的蒟蒻OIerOIer,沒能參加NOIPNOIP是我一生的遺憾。但在遺憾之餘,我不得不備戰CSPCSP的認證。而CSPCSP非專業級認證的第一輪(也就是NOIPNOIP初賽)常常使某些大神OIerOIer(就是對基礎知識不太瞭解)無緣複賽...所以今天來盤一下初賽知識點,順帶著自己也學習一下......


資訊學史及基本知識

一、資訊學及計算機史

  • 計算機的頂級獎項:圖靈獎、馮·諾依曼獎

圖靈獎:由ACM(美國計算機協會)設立於1966年。是“計算機界的諾貝爾獎”。

馮·諾依曼獎:由IEEE設立。

  • 對資訊科學做出突出貢獻的大神:圖靈(所以才有個獎),馮 · 諾伊曼

  • 中國獲圖靈獎的大神:姚期智(清華就有姚班,就是以他的名字命名的)

  • 世界第一臺電子計算機:埃尼阿克(ENIACENIAC),於1946年2月14日(夠虐狗的)在美國賓夕法尼亞大學誕生。又被叫做電子管計算機。

二、關於程式設計

  • 程式語言

分兩類:面向物件和麵向過程。

  • 高階語言和低階語言的區別

高階語言需要編譯執行,常數較大,執行速度慢。而低階語言常數極小,執行速度快。此外,高階語言更容易移植。

  • 常見低階語言

彙編

  • 面向物件的高階語言

C++,Java,EIFFEL,Simula 67等。

  • 面向過程的高階語言

C,Fortran語言。

  • 遞迴程式設計

遞迴是指一種通過重複將問題分解為同類的子問題而解決問題的方法。遞迴式方法可以被用於解決很多的電腦科學問題。簡單來講,就是“自身呼叫自身”(在函式中)。

  • P類/NP類/NPC類問題

1、P類問題:如果一個問題能找到一個在多項式時間內解決它的演算法,那麼這個問題就是P問題。

2、NP類問題:注意:NP問題不是非P類問題,而是在多項式時間內驗證一個解的問題。或者,我們可以將其理解為在多項式時間內猜出一個解的問題。

3、NPC類問題:定義如下:如果一個問題是NP問題,而且所有的NP問題都可以約化到它。那麼它就是NPC類問題。再來介紹一下關於約化的定義:如果一個問題A可以約化為問題B,含義就是這個問題A可以用問題B的解法來解決。

三、關於計算機

先上張大圖:

  • 重要裝置

    硬體組成:

    1. 控制器(Control):是整個計算機的中樞神經,其功能是對程式規定的控制資訊進行解釋,根據其要求進行控制,排程程式、資料、地址,協調計算機各部分工作及記憶體與外設的訪問等。

    2. 運算器(Datapath):運算器的功能是對資料進行各種算術運算和邏輯運算,即對資料進行加工處理。

    3. 儲存器(Memory):儲存器的功能是儲存程式、資料和各種訊號、命令等資訊,並在需要時提供這些資訊。

    4. 輸入裝置(Input system):輸入裝置是計算機的重要組成部分,輸入裝置與輸出裝置合稱為外部裝置,簡稱外設,輸入裝置的作用是將程式、原始資料、文字、字元、控制命令或現場採集的資料等資訊輸入到計算機。常見的輸入裝置有鍵盤、滑鼠器、光電輸入機、磁帶機、磁碟機、光碟機等。

    5. 輸出裝置(Output system):輸出裝置與輸入裝置同樣是計算機的重要組成部分,它把外算機的中間結果或最後結果、機內的各種資料符號及文字或各種控制訊號等資訊輸出出來。微機常用的輸出裝置有顯示終端CRT、印表機、鐳射印字機、繪圖儀及磁帶、光碟機等。

  • CPU及儲存

CPU(中央處理器)=運算器+控制器+暫存器

運算器=算術邏輯運算單元(ALU)及浮點運算單元(FPU)

儲存器=記憶體儲器+外儲存器

BIOS是英文"Basic Input Output System"的縮略語,直譯過來後中文名稱就是"基本輸入輸出系統"。其實,它是一組固化到計算機內主機板上一個ROM晶片上的程式,它儲存著計算機最重要的基本輸入輸出的程式、系統設定資訊、開機後自檢程式和系統自啟動程式。 其主要功能是為計算機提供最底層的、最直接的硬體設定和控制。

隨機儲存器RAM的“隨機”指“隨時訪問”

所以,我們記下來以下知識點:

斷電後可以儲存資料:硬碟,ROM

斷電後不可以儲存資料:視訊記憶體(顯示卡記憶體),RAM,CPU

  • 計算機各儲存單位及進位關係

計算機的儲存單位有以下幾種:

TB/GB/MB/KB/BTB/GB/MB/KB/B

他們之間的進位關係為1024(這應該是常識,沒打過比賽還沒玩過手機麼?)

特殊地,1B=8(bit)1B=8(bit),這裡的bitbit是二進位制下的一位記憶體。


進位制及進位制轉化

十進位制轉任意進位制

將十進位制轉換成NN進位制,只需把十進位制數每次除NN求餘數,然後把餘數逆序寫出來。

看不懂就看圖:

這是二進位制的圖,其他進位制就類比推一下就可以了。如果這個看不懂的話就不要參加初賽了,50塊錢買點啥不好...

任意進位制轉十進位制

簡單說就是:按位轉,第ii位的數字乘以要轉換的進位制的n1n−1次冪即可。

還是上圖:

任意進位制互相轉化

這裡考慮用十進位制做中轉,先把AA進位制轉十進位制,再把十進位制轉BB進位制。

關於小數的進位制轉換

十進位制轉任意進位制的小數不進行除法運算,而進行乘法運算後取整,取整後從前向後排列。

任意進位制轉十進位制的小數只需要乘上負指數,最後算出來即可。

各進位制的字母表達

H(Hexadecimal)H(Hexadecimal)——16進位制

D(Decimal)D(Decimal)——10進位制

O(Octonary)O(Octonary)——8進位制

B(Binary)B(Binary)——2進位制

二進位制的相關知識

二進位制是計算機進行計算所使用的工具,自然也是非常常考的要點。二進位制的相關知識有許多,甚至演算法中的位運算也是二進位制的相關內容,但為了過第一輪初賽,我們只介紹一些理論知識。關於位運算的相關知識請有興趣的同學自己學習。

  • 1、原碼

顧名思義,原碼就是十進位制數直接轉換成二進位制之後直接形成的二進位制編碼。

  • 2、補碼

正數的補碼是本身,負數的補碼是其反碼加一

  • 3、反碼

顧名思義:正數的反碼是本身,負數的反碼是其除符號位之外的所有位按位取反的結果。

附:ASCII碼

ASCII碼的正規名稱是:美國資訊交換標準程式碼,是基於拉丁字母的一套電腦編碼系統。是最通用的資訊交換標準。一共定義了128個字元。

這裡不賦ASCII碼的轉換表。只給出幾種比較常用的轉換:

字元0→48

大寫字母A→65

小寫字母a→97

空格→32

換行→13


位運算

位運算不僅在初賽中是一個知識點分類,在複賽(即真正的程式設計與運用)的時候也有很大的一個應用。而且,位運算的相關知識是計算機運算的靈魂,更是每個程式猿應該理解的一種基本操作。

關於位運算的相關知識,本蒟蒻在另一篇專門的部落格中詳細的講解。

常用的位運算技巧

為了應對初賽的筆試題,建議讀者在閱讀完這篇部落格之後至少應該掌握:各種位運算的運演算法則以及位運算優先順序

另外,對於位運算的優先順序,本蒟蒻在後面的邏輯運算部分還會有詳細的解析。

邏輯運算

邏輯運算

邏輯運算一共有三種,每種都有兩種寫法:

邏輯非:!或 ┐

邏輯與:&& 或 ∧

邏輯或:|| 或 ∨

邏輯運算的優先順序

>>與>>或

位運算+邏輯運算的優先順序

邏輯非(!,┐)=按位反(~)>位移運算(<<,>>)>不等號(>=,<=)>等號(==,!=)>按位與(&)>按位異或(^)>按位或(|)>邏輯與(&&,∧)>邏輯或(||,∨)

邏輯表示式

由邏輯運算複合而成,只有兩種結果:truetrue和falsefalse,在C/C++中,返回的值以00表示假,以11表示真。

條件表示式

條件表示式的基本形式如下:

<表示式1>?<表示式2>:<表示式3>

其表達意義是:如果表示式1成立,則執行表示式2,否則執行表示式3。其實也等價於ifelseif−else條件語句。例如下:

#define Min(a,b) a<b?a:b

注意:如果條件表示式有多個進行復合,那麼在執行的時候需要從由往左依次判斷最後得出一個結果。即:右結合性

比如:

<表示式1>?<表示式2>:<表示式3>?<表示式4>:<表示式5>

那麼,在執行的時候是從3開始判斷是否為真,然後執行某一個表示式,依次向上回溯。


圖論理論知識

基本概念

  • 完全圖:任意兩點都有邊相連,我們很容易推出來,一張完全圖的邊數為(nn為節點個數)
n×(n1)2n×(n−1)2
  • 連通圖:顧名思義,連通圖就是連通的圖,即任意兩點都能直接或間接到達,這就區別於完全圖必須直接用邊到達的定義。

  • :emm...直觀來講,就是一張長得像樹的圖。定義是任意兩點之間的簡單路徑有且只有一條。樹是一棵連通且無環的圖。它的邊數是n1n−1。

二叉樹的遍歷

二叉樹有不同的遍歷方式,一般來講,我們將其分成三類:先序遍歷(也叫先根遍歷)、中序遍歷(中根遍歷)以及後序遍歷(後根遍歷)。

  • 先序遍歷:遍歷方式如下:根—左兒子—右兒子

  • 中序遍歷:遍歷方式如下:左兒子—根—右兒子

  • 後序遍歷:遍歷方式如下:左兒子—右兒子—根

我們用一張圖來理解一下這幾種遍歷方式。

這張圖的先序遍歷:1245367

中序遍歷:4251637

後序遍歷:4526731

  • 一個推論

    先序遍歷+中序遍歷=一棵確定的二叉樹

    後序遍歷+中序遍歷=一棵確定的二叉樹

    先序遍歷+後序遍歷=啥也不是

特殊二叉樹及其性質

  • 完全二叉樹:只有最後一層不是滿的,且最後一層的所有節點均集中在左側。

圖例如下:

  • 滿二叉樹:節點個數已滿。

圖例如下:

  • 特殊二叉樹的性質

1、對於一棵完全二叉樹來講,它的葉子節點為nn,則節點總數為2×n12×n−1。此結論可逆。

2、對於一棵滿二叉樹來講,它的層數(深度)為kk,則它的節點總數為2k12k−1。此結論可逆。

拓撲排序

本蒟蒻有一篇專門講拓撲排序的講解:

拓撲排序詳解


簡單資料結構基本理論

1、棧

想象一個桶,你從上面往裡扔磚,然後你想把某一塊磚拿出來,你需要先拿出來你後扔進去的磚。這就是棧。棧的基本原則是:後進先出

來一發圖示?

附:前、中、字尾表示式

一篇專門的部落格:

淺談前、中、字尾表示式

2、佇列

想象你在排隊買票,這個隊伍中的人都非常有素質,都自覺排隊而且不會提前離開隊伍。這樣就只能從隊首買完票再離開,從隊尾進入隊伍。佇列的基本原則是:先進先出。

再來一發圖示:

3、連結串列

連結串列分兩種:單向連結串列和雙向連結串列。關於連結串列,我有一篇專門講解的部落格。有興趣的讀者請戳:

連結串列詳解

4、字串

字串子串的概念:字串是一串字元(廢話),它的子串被定義為:字串中任意個連續的字元組成的子序列

字串子串個數的計算公式:

n×(n+1)2+1n×(n+1)2+1

(就是字串長度等差數列)

如果是非空子串,就把那個一減去即可(子串個數的公式加一就是考慮空子串的情況)。


時空複雜度的計算

  • 時間複雜度:漸進時間複雜度用符號OO表示。一個程式的語句執行次數可以用一個代數式表示,那麼我們取這個代數式的最高次項且忽略此項係數作為時間複雜度。如果一個程式的語句執行次數為2n3+3n2+n+72n3+3n2+n+7,那麼這個程式的漸進時間複雜度為O(n3)O(n3)。

  • 計算非遞迴程式的時間複雜度:簡單粗暴,數迴圈。

  • 常數:常數即為我們忽略掉的OO中最高次項的係數與低次項所帶來的時間消耗。

  • 空間複雜度:類比時間複雜度。看開空間開了多大。

  • 計算空間佔用量:根據我們以上說過的計算機儲存單位的知識:一個intint佔用的記憶體是4B4B,所以我們把開的intint乘上4,再除以1024就是KBKB,同理,再除10241024就是MBMB。

公式:nn為元素個數,MM為最終答案(以MBMB為單位)

M=4n1024×1024M=4n1024×1024

PS:一般來講,比賽中所給的256MB256MB記憶體可以開6×1076×107個intint型別的變數。另外,大陣列必須開全域性變數。如果扔在主函式裡極容易爆棧。


數學、邏輯學及運籌學知識

  • 排列組合:排列組合是每年必考知識點。但是這是一個比較大的課題。不僅是高二數學選修重點,也是數學程式設計的一個重要分支。關於排列組合及相關知識,我有一個專門講解排列組合的部落格,歡迎讀者翻閱:

淺談排列組合

  • 幻方

題目型別整理

題型知識點型別題目數量
單選 資訊學史&基本知識 8-10
單選 C++語法知識點 2-3
單選 資料結構&演算法 3-4
單選 數學&邏輯學&運籌學 3-4
單選 比賽相關知識 1-2
問題求解 數學 1
問題求解 資料結構 1
模擬程式執行 C++語法&演算法 4
完善程式 C++語法&演算法 2

閱讀&使用說明

因為本部落格知識點較多,推薦大家一點點學、一點點用,不要一口氣讀完。(神犇請自動忽略這句話)作為一篇發表後不到一個月就在閱讀量上遙遙領先的部落格,我感到極其的驚喜和感動。但是因為本蒟蒻太菜了,所以敬請有緣讀到這篇部落格的各路大佬多支援多幫助,指正講解中的錯誤,並順手點一下推薦......

再次感謝大家的資瓷!!並祝大家CSPS2019RP++CSP−S2019RP++——UPD:2019.10.14

——傅思維fromJDFZ