史上最全的CSP-J/S 第一輪知識點

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

\(NOIP\)(全國青少年信息學奧林匹克競賽)於2019年取消。取而代之的是由\(CCF\)推出的非專業級軟件能力認證,也就是如今的\(CSP-J/S\)。做爲一名於2019年1月入\(OI\)的蒟蒻\(OIer\),沒能參加\(NOIP\)是我一輩子的遺憾。但在遺憾之餘,我不得不備戰\(CSP\)的認證。而\(CSP\)非專業級認證的第一輪(也就是\(NOIP\)初賽)經常使某些大神\(OIer\)(就是對基礎知識不太瞭解)無緣複賽...因此今天來盤一下初賽知識點,順帶着本身也學習一下......html


信息學史及基本知識

1、信息學及計算機史

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

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

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

  • 對信息科學作出突出貢獻的大神:圖靈(因此纔有個獎),馮 · 諾伊曼數組

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

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

2、關於編程

  • 編程語言

分兩類:面向對象和麪向過程。函數

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

高級語言須要編譯運行,常數較大,運行速度慢。而低級語言常數極小,運行速度快。此外,高級語言更容易移植。工具

  • 常見低級語言

彙編學習

  • 面向對象的高級語言

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

  • 面向過程的高級語言

C,Fortran語言。

  • 遞歸編程

遞歸是指一種經過重複將問題分解爲同類的子問題而解決問題的方法。遞歸式方法能夠被用於解決不少的計算機科學問題。簡單來說,就是「自身調用自身」(在函數中)。

  • P類/NP類/NPC類問題

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

二、NP類問題:注意:NP問題不是非P類問題,而是在多項式時間內驗證一個解的問題。或者,咱們能夠將其理解爲在多項式時間內猜出一個解的問題。

三、NPC類問題:定義以下:若是一個問題是NP問題,並且全部的NP問題均可以約化到它。那麼它就是NPC類問題。再來介紹一下關於約化的定義:若是一個問題A能夠約化爲問題B,含義就是這個問題A能夠用問題B的解法來解決。

3、關於計算機

先上張大圖:

  • 重要設備

    硬件組成:

    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/B\)

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

特殊地,\(1B=8(bit)\),這裏的\(bit\)是二進制下的一位內存。


進制及進制轉化

十進制轉任意進制

將十進制轉換成\(N\)進制,只需把十進制數每次除\(N\)求餘數,而後把餘數逆序寫出來。

看不懂就看圖:

這是二進制的圖,其餘進制就類比推一下就能夠了。若是這個看不懂的話就不要參加初賽了,50塊錢買點啥很差...

任意進制轉十進制

簡單說就是:按位轉,第\(i\)位的數字乘以要轉換的進制的\(n-1\)次冪便可。

仍是上圖:

任意進制互相轉化

這裏考慮用十進制作中轉,先把\(A\)進制轉十進制,再把十進制轉\(B\)進制。

關於小數的進制轉換

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

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

各進制的字母表達

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

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

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

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

二進制的相關知識

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

  • 一、原碼

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

  • 二、補碼

正數的補碼是自己,負數的補碼是其反碼加一

  • 三、反碼

顧名思義:正數的反碼是自己,負數的反碼是其除符號位以外的全部位按位取反的結果。

附:ASCII碼

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

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

字符0→48

大寫字母A→65

小寫字母a→97

空格→32

換行→13


位運算

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

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

經常使用的位運算技巧

爲了應對初賽的筆試題,建議讀者在閱讀完這篇博客以後至少應該掌握:各類位運算的運算法則以及位運算優先級

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

邏輯運算

邏輯運算

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

邏輯非:!或 ┐

邏輯與:&& 或 ∧

邏輯或:|| 或 ∨

邏輯運算的優先級

\(>\)\(>\)

位運算+邏輯運算的優先級

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

邏輯表達式

由邏輯運算複合而成,只有兩種結果:\(true\)\(false\),在C/C++中,返回的值以\(0\)表示假,以\(1\)表示真。

條件表達式

條件表達式的基本形式以下:

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

其表達意義是:若是表達式1成立,則執行表達式2,不然執行表達式3。其實也等價於\(if-else\)條件語句。例以下:

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

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

好比:

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

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


圖論理論知識

基本概念

  • 徹底圖:任意兩點都有邊相連,咱們很容易推出來,一張徹底圖的邊數爲(\(n\)爲節點個數)

\[ \frac{n\times (n-1)}{2} \]

  • 連通圖:顧名思義,連通圖就是連通的圖,即任意兩點都能直接或間接到達,這就區別於徹底圖必須直接用邊到達的定義。

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

二叉樹的遍歷

二叉樹有不一樣的遍歷方式,通常來說,咱們將其分紅三類:先序遍歷(也叫先根遍歷)、中序遍歷(中根遍歷)以及後序遍歷(後根遍歷)。

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

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

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

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

這張圖的先序遍歷:1245367

中序遍歷:4251637

後序遍歷:4526731

  • 一個推論

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

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

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

特殊二叉樹及其性質

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

圖例以下:

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

圖例以下:

  • 特殊二叉樹的性質

一、對於一棵徹底二叉樹來說,它的葉子節點爲\(n\),則節點總數爲\(2\times n-1\)。此結論可逆。

二、對於一棵滿二叉樹來說,它的層數(深度)爲\(k\),則它的節點總數爲\(2^k-1\)。此結論可逆。

拓撲排序

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

拓撲排序詳解


簡單數據結構基本理論

一、棧

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

來一發圖示?

附:前、中、後綴表達式

一篇專門的博客:

淺談前、中、後綴表達式

二、隊列

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

再來一發圖示:

三、鏈表

鏈表分兩種:單向鏈表和雙向鏈表。關於鏈表,我有一篇專門講解的博客。有興趣的讀者請戳:

鏈表詳解

四、字符串

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

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

\[ \frac{n\times (n+1)}{2}+1 \]

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

若是是非空子串,就把那個一減去便可(子串個數的公式加一就是考慮空子串的狀況)。


時空複雜度的計算

  • 時間複雜度:漸進時間複雜度用符號\(O\) 表示。一個程序的語句執行次數能夠用一個代數式表示,那麼咱們取這個代數式的最高次項且忽略此項係數做爲時間複雜度。若是一個程序的語句執行次數爲 \(2n^3+3n^2+n+7\),那麼這個程序的漸進時間複雜度爲\(O(n^3)\)

  • 計算非遞歸程序的時間複雜度:簡單粗暴,數循環。

  • 常數:常數即爲咱們忽略掉的\(O\)中最高次項的係數與低次項所帶來的時間消耗。

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

  • 計算空間佔用量:根據咱們以上說過的計算機存儲單位的知識:一個\(int\)佔用的內存是\(4B\),因此咱們把開的\(int\)乘上4,再除以1024就是\(KB\),同理,再除\(1024\)就是\(MB\)

公式:\(n\)爲元素個數,\(M\)爲最終答案(以\(MB\)爲單位)
\[ M=\frac{4n}{1024\times 1024} \]
PS:通常來說,比賽中所給的\(256MB\)內存能夠開\(6\times 10^7\)\(int\)類型的變量。另外,大數組必須開全局變量。若是扔在主函數裏極容易爆棧。


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

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

淺談排列組合

  • 幻方

題目類型整理

題型 知識點類型 題目數量
單選 信息學史&基本知識 8-10
單選 C++語法知識點 2-3
單選 數據結構&算法 3-4
單選 數學&邏輯學&運籌學 3-4
單選 比賽相關知識 1-2
問題求解 數學 1
問題求解 數據結構 1
模擬程序運行 C++語法&算法 4
完善程序 C++語法&算法 2

閱讀&使用說明

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

再次感謝你們的資瓷!!並祝你們\(CSP-S\quad 2019\quad RP++\)——UPD:2019.10.14

——傅思惟\(from\quad JDFZ\)

相關文章
相關標籤/搜索