1. 程式人生 > 實用技巧 >[五年CSP三年模擬]洛谷2020初賽模擬賽分析

[五年CSP三年模擬]洛谷2020初賽模擬賽分析

單項選擇題



第1題

題面

1.十進位制數 \(114\) 的相反數的 \(8\) 位二進位制補碼是:
A.10001110\(\qquad\)B.10001101
C.01110010\(\qquad\)D.01110011

分析與解答

\(114\) 的相反數為 \(-114\)
\(-114\) 的二進位制原碼為 \(11110010\)
所以它的補碼為原碼按位取反加一
即為 \(10001110\)選 A.


第2題

題面

2.以下哪個網站不是 Online Judge (線上程式判題系統)? Online Judge可以檢視演算法題目,提交自己編寫的程式,然後可以獲得評測機反饋的結果。
A.Luogu\(\qquad\)

B.Gitee\(\qquad\)C.Leetcode\(\qquad\)D.Codeforces

分析與解答

不多BB,自己點進去看[\doge]


第3題

題面

小A用字母 \(A\) 表示 \(1\),用 \(B\) 表示 \(2\),以此類推,用 \(Z\) 表示 \(26\)。對於 \(27\) 以上的數字,可以用兩位或者更長的字串對應,例如 \(AA\) 表示 \(27\)\(AB\) 表示 \(28\)\(AZ\) 對應 \(52\)\(AAA\) 對應 \(703\)……那麼 \(BYT\) 字串對應的數字是什麼?
A.2018\(\qquad\)B.2020\(\qquad\)

C.2022\(\qquad\)D.2024

分析與解答

我們發現,我們可以把它看成一種特殊的27進位制數,這種數沒有 '0' 這個數字,打個比方,就像十進位制數 '9' 之後直接是 '11','99' 之後直接是 '111',即第二位向第三位進一時需要的數不用加上第一位的 26 ,那麼我們可以發現,\(27\) 向第二位進一,但上一位需保留 \(1\)(所以第二位每一個一隻包含26),每 \(26^2\) 向第三位進一
通過推算可以得到下表

Str Num Str*
A 1 \(1\)
Z 26 \(Z\)
AA 27 \(Z + 1\)
AZ 52 \(Z + Z\)
BA 53 \(Z + Z + 1\)
ZZ 702 \(26^2 + Z\)
AAA 703 \(ZZ + 1\)
AZZ 1378 \(ZZ + 26^2\)
BZZ 2054 \(ZZ + 2 \times 26^2\)
BYZ 2038 \(ZZ + 2 \times 26^2 - Z\)
BYT 2022 \(ZZ + 2 \times 26^2 - Z - 16\)

故選 B.


第4題

題面

分析與解答

圖片大小計算公式:

\[圖片大小=\dfrac{解析度(長 \times 寬) \times 位深}{8} \]

這張圖片的大小為:

\[\begin{align*} &\dfrac{4096 \times 2160 \times 24}{8} B\\ =&(1024 \times 1080 \times 24) B\\ =&(1080 \times 24) KB\\ \approx & 25MB \end{align*}\]

故選 B.


第5題

題面

分析與解答

最快的排序為 桶排序,時間複雜度為 \(O(n)\)故選 A.


第6題

題面

分析與解答

樹是一個簡單無環連通圖,故①④錯
選 C.


第7題

題面

分析與解答

每次分成兩堆,每張卷子至少檢視兩次,故為 \(42 \times 2=84\)
故選 A.


第8題

題面

分析與解答

  • 前序遍歷(VLR)是二叉樹遍歷的一種,也叫做先根遍歷、先序遍歷、前序周遊,可記做根左右。前序遍歷首先訪問根結點然後遍歷左子樹,最後遍歷右子樹。
  • 中序遍歷(LDR)是二叉樹遍歷的一種,也叫做中根遍歷、中序周遊。在二叉樹中,中序遍歷首先遍歷左子樹,然後訪問根結點,最後遍歷右子樹。
    由以上的定義我們可以很輕鬆的畫出這棵樹:

    我們又知道,二叉樹中,結點 \(i\) 的左兒子編號為 \(2 \times i\),右兒子編號為 \(2 \times i+1\)
    故可得下圖

    所以陣列最大下標為 \(13\)
    故選 B.

第9題

題面

分析與解答

優先順序: \(! > \&\& > ||\)
A選項:\(a\&\&b=0\)\(b\&\&c=0\),所以 \(0||0=0\)
B選項:\(a+b>c=0\)\(b=0\),所以 \(0||0=0\)
C選項:\(!c=0\)\(!a||b=0\),所以 \(0||0=0\)
D選項:\(a+b+c=2\)C艹C++中bool運算非0即
故選 D.


第10題

題面

分析與解答

連結串列的查詢是由前向後逐個查詢,那麼查詢次數最少的情況就是每次要查詢的數都是連結串列的頭結點,每次只訪問一個結點,共有 \(k\) 次請求,故為 \(k\)
故選 B.


第11題

題面

分析與解答

  • 列舉大法

這顯然是道排列組合,不過資料較小,可以列舉列舉大法好
要注意每個班有人數限制

i C B A
1 0 0 5
2 0 2 4
3 0 3 3
4 0 4 2
5 1 0 5
6 1 1 4
7 1 2 3
8 1 3 2
9 1 4 1
10 2 0 4
11 2 1 3
12 2 2 2
13 2 3 1
14 2 4 0
15 3 0 3
16 3 3 0
17 3 1 2
18 3 2 1

\(18\)

  • 排列組合

我們可以將這個問題看成 “有 \(6\) 個相同的小球,放進 \(3\) 個不相同的的盒子中,每個盒子有限制,可以為空”
我們先來求 “有 \(6\) 個相同的小球,放進 \(3\) 個不相同的的盒子中,可以為空” 的所有情況,即

\[C^{m-1}_{n+m-1}=C^2_8=\dfrac{8!}{(8 - 2)! \times 2!} = 28 \]

其中 “有一個盒子中有 \(6\) 個小球,其餘盒子為空”\(3\) 種情況都無法滿足條件
“有一個盒子中有 \(5\) 個小球,其餘兩個盒子中,有一個盒子裡有 \(1\) 個球”的情況下,這 \(5\) 個球在B盒或C盒的 \(2 \times 2=4\) 種情況無法滿足條件

對於每個盒子,盒子裡有 \(5\) 個球時,都有 \(2\) 種情況,為1 5 0,0 5 10 1 5,1 0 5

“有一個盒子中有 \(4\) 個小球,其餘 \(2\) 個球分散在剩下兩個盒子裡” 的情況下,這 \(4\) 個球在C盒的 \(C^1_3=3\) 種情況(4 0 2,4 2 0,4 1 1)無法滿足條件
那麼共有 \(28 - 3 - 4 - 3 = 18\) 種情況
故選 B.


第12題

題面

分析與解答

各排序時間複雜度(平均):

  • 插入排序 \(O(n^2)\)
  • 希爾排序 \(O(n^{1.3})\)
  • 選擇排序 \(O(n^2)\)
  • 堆排序 \(O(n\log{n})\)
  • 氣泡排序 \(O(n^2)\)
  • 快速排序 \(O(n\log{n})\)
  • 歸併排序 \(O(n\log{n})\)
  • 基數排序 \(O(d(r+n))\)\(d\) 表示長度,\(r\) 表示關鍵字基數,\(n\) 表示關鍵字個數)

故選 B.


第13題

題面

分析與解答

\(x \in [a,b)\) 表示 \(a \leqslant x < b\)
rand()%M表示生成一個在區間 \([0,M)\) 內的隨機數
所以rand()%M+a可生成一個在區間 \([a,M+a)\) 內的隨機數
那麼生成一個在區間 \([a,b)\) 內的隨機數就等價於生成一個在區間 \([a,b-a+a)\) 內的隨機數
即為rand()%(b-a)+a
故選 A.


第14題

題面

分析與解答

我們首先看森林完全圖的定義:
森林(forest)是 \(m\)(\(m \geqslant 0\))棵互不相交的樹的集合。
完全圖是一個簡單的無向圖,其中每對不同的頂點之間都恰連有一條邊相連。

所以,只有一棵樹也可以稱作森林
那這道題就變成了 “一個7個頂點的完全圖需要至少刪掉多少條邊才能變成一棵樹?”
一個有7個頂點的完全圖共有 \(\dfrac{7 \times (7-1)}{2}=21\)條邊
一棵有7個結點的樹共有 \(6\) 條邊
所以最少刪去 \(21-6=15\) 條邊

故選 C.


第15題

題面

分析與解答

第37屆全國青少年資訊學奧林匹克競賽(CCF NOI2020)於2020年8月16-21日在長沙市一中雨花新華都學校舉行
故選 D.

歷屆NOI舉辦時間與地點


閱讀程式



第1題

#include<iostream>
using namespace std;
#define MAXN 20
int gu[MAXN][MAXN];
int luo(int n, int m) {
	if(n <= 1 || m < 2)
	    return 1;
	if(gu[n][m] != -1)
	    return gu[n][m];
	int ans = 0;
	for(int i = 0;i < m;i += 2)
	    ans += luo(n - 1,i);
	gu[n][m] = ans;
	return ans;
}
int main(){
	int n, m;
	cin >> n >> m;
	for(int i = 0; i < MAXN; i++)
	   for(int j = 0; j < MAXN; j++)
	      gu[i][j] = -1;
	cout << luo(n, m);
	return 0;
}

1.luo函式中,\(m\) 的值不可能是奇數 ( )
在主程式main()中,傳入luo(n,m),這裡 \(m\) 的值由鍵盤輸入,可以為奇數,故為錯
2.若將第11行的 “<” 改為 “<=”,程式的輸出結果可能會改變 ( )
改後可能會多迴圈一次,結果可能會改變,故為對
3.若將第8.9.13行刪除,程式的執行的結果不變 ( )
觀察程式可以發現,二維陣列gu[i][j]是用作記憶化搜尋
而第8.9.13行則是進行記憶化搜尋的實現,記憶化搜尋僅會減少程式執行的時間,但不會改變結果,故為對
4.在新增合適的標頭檔案後,將第19到21行替換為memset(gu,255,sizeof(gu));可以起到相同的作用 ( )
第19到21行是給二維陣列gu[i][j]賦初值 \(-1\)
memset() 是給每一個byte賦值
int是4 byte = 32bit
255的二進位制是 11111111,但是當賦值給陣列時以補碼形式賦值,第一位是符號位,就變成了 \(-1\)故為對
5.若輸入資料為 4 8,則輸出為( )
A.7\(\qquad\)B.8\(\qquad\)C.15\(\qquad\)D.16
沒什麼好說的,要有一顆勇於模擬的心ヽ( ̄▽ ̄)و選B.
6.最壞情況下,此程式的時間複雜度是( )
A.\(O(m^2n)\qquad\)B.\(O(nm!)\qquad\)C.\(O(n^2)\qquad\)D.\(O(n^2m)\)
不會,過/kk 選 A.


第2題



1.錯誤
調整之後,f[i][k]f[k][j] 可能並沒有計算或得到的不是最優解,但只被計算2次,不能保證是全域性最優解,而原程式則會計算多次,保證為最優解
2.錯誤
m與輸入有關,想想為什麼會有快讀這個東西
3.正確
注意資料範圍,當整個為一條鏈或資料足夠大時,答案會超出 \(10^7\)
4.正確
兩者順序更換對答案並無影響
5.A
我們首先需要知道這個程式是在求什麼,
第14到19行,求的是原圖的任意兩點間最短路長度
第21到40行,則是將原圖中任意兩點併為一點,再求出此時任意兩點間最短路長度之和,取最小值,資料並不大,可以手動模擬
6.A
這奇妙的時間複雜度,肯定就是Floyd(。-`ω´-)


未完待續...


更新日誌及說明

更新

  • 初次完成編輯 - \(2020.10.9\)
    本文若有更改或補充會持續更新

個人主頁

歡迎到以下地址支援作者!
Github戳這裡
Bilibili戳這裡
Luogu戳這裡