CSP-S 2024 提高組初賽解析(更新至單項選擇)

HaneDaniko發表於2024-09-22

答案

AACBB
BDABD
ACBCD
✓××BC
✓✓✓BCC
✓×✓CAC
AAAAA
AABAA

單項選擇

1

在 Linux 系統中,如果你想顯示當前工作目錄的路徑,應該使用哪個命令?

A pwd
B cd
C ls
D echo

pwd : print working directory
cd : 跳轉到指定目錄
ls : 列出當前目錄的所有子檔案和子資料夾
echo : 輸出指定內容

2

假設一個長度為n的整數陣列中每個元索值互不相同,且這個陣列是無序的。要找到這個陣列中最大元素的時間複雜度是多少?

A \(O(n)\)
B \(O(logn)\)
C \(O(nlogn)\)
D \(O(1)\)

無序的陣列只能透過兩兩比較來查詢,需要比較 \(n-1\) 次(第一次不需要比較),因此為 \(O(n)\)

3

在 C++中,以下哪個函式呼叫會造成溢位?

A int foo(){ return 0;}
B int bar(){int x=1;return x; }
C void baz(){ int a[1000];baz();)
D void qux(){ return; }

函式棧溢位一般有兩種:函式內變數開的太大,或者函式遞迴深度太深

這裡 baz() 函式重複呼叫自身,無終止條件,因此會溢位

4

在一場比賽中,有 \(10\) 名選手參加,前三名將獲得金、銀、牌。若不允許並列,且每名選手只能獲得一枚獎牌,則不同的頒獎方式有多少種?

A 120
B 720
C 504
D 1000

不妨選出一個長度為 \(3\) 的序列,依次獲得金,銀,銅牌,則方案有 \(A^{3}_{10}=10\times 9\times 8=720\)

5

下面哪個資料結構最適合實現先進先出(FIFO)的功能?

A 棧
B 佇列
C 線性表
D 二叉搜尋樹

棧是先進後出

後面兩種資料結構不具備存放與彈出基本資料的功能

線性表在功能上類似陣列

6

已知 \(f(1)=1\),且對於 \(n\ge2\)\(f(n)=f(n-1)+f(⌊n/2⌋)\) ,則 \(f(4)\) 的值為:

A \(4\)
B \(5\)
C \(6\)
D \(7\)

\(f(2)=f(1)+f(1)=2\)

\(f(3)=f(2)+f(1)=3\)

\(f(4)=f(3)+f(2)=5\)

7

假設有一個包含 \(n\) 個頂點的無向圖,且該圖是尤拉圖。以下關於該圖的描述中哪一項不一定正確?

A 所有頂點的度數均為偶數
B 該圖連通
C 該圖存在一個尤拉回路
D 該圖的邊數是奇數

尤拉圖定義:僅由尤拉回路構成的圖

尤拉回路:即一筆能畫完的圖。形式化地說,尤拉回路是從任意一個點出發,不重複經過任何一條邊,也不遺漏任何一條邊,最終仍能回到該節點的路徑

根據定義,D 是錯誤的,反例為一個正方形

8

對陣列進行二分查詢的過程中,以下哪個條件必須滿足?

A 陣列必須是有序的
B 陣列必須是無序的
C 陣列長度必須是 \(2\) 的冪
D 陣列中的元素必須為整數

二分查詢本質上也是一種二分答案,需要保證答案具有單調性

9

考慮一個自然數 \(n\) 以及一個數 \(m\),你需要計算 \(n\) 的逆元(即 \(n\)\(m\) 意義下的乘法逆元),下列哪種演算法最為適合?

A 使用暴力法依次嘗試
B 使用擴充套件歐幾里得演算法
C 使用快速冪法
D 使用線性篩法

逆元的定義是這樣的:

定義 \(a\) 在模 \(p\) 意義下的逆元 \(b\) 滿足 \((\frac{c}{a})\mod p=(c\times b)\mod p\)

\(p\) 為質數的時候,才能使用快速冪(+費馬小定理)來求逆元,而擴充套件歐幾里得演算法為更加通用的求逆元方法,只需要滿足兩個數互質

更詳細的求逆元方法可以透過 這篇文章 的 5.3.1 章瞭解

10

在設計一個雜湊表時,為了減少衝突,需要使用適當的雜湊函效和衝突解決策略。已知某雜湊表中有 \(n\) 個鍵值對,表的裝載因子為 \(a(0<a\le 1)\) 。在使用開放地址法解決衝突的過程中,最壞情況下查詢一個元素的時間複雜度為

A \(O(1)\)
B \(O(logn)\)
C \(O(1/(1-a))\)
D \(O(n)\)

開放地址法解決衝突:假設當前元素 \(x\) 需要放入地址 \(p\) 中,但現在 \(p\) 位置已經有了元素,直接放置就會導致衝突,因此考慮向後依次找,找到第一個沒有放置元素的位置放置,這樣可以防止衝突(遍歷到最後再從頭開始)

因此最壞情況下需要把整個表遍歷一遍,複雜度為 \(O(n)\)

科普裝載因子的定義:裝載因子定義了一個閾值,當雜湊表中的條目數超出了載入因子與當前容量的乘積時,則要對該雜湊表進行擴容、rehash操作(即重建內部資料結構),擴容後的雜湊表將具有兩倍的原容量。

11

假設有一棵 \(h\) 層的完全二叉樹,該樹最多包含多少個結點?

A \(2^h-1\)
B \(2^{h+1}-1\)
C \(2^h\)
D \(2^{h+1}\)

因為每個節點都有兩個兒子,因此每一層的節點個數都是上一層的兩倍

總結點數為 \(1+2^{1}+2^{2}+\cdots+2^{h-1}=2^{h}-1\)

12

設有一個 \(10\) 個頂點的完全圖,每兩個頂點之間都有一條邊。有多少個長度為 \(4\) 的環?

A \(120\)
B \(210\)
C \(630\)
D \(5040\)

因為圖完全聯通,任取四個點一定能保證它們構成一個環

因為環上的點是無序的,因此很多人會考慮計算 \(C^{4}_{10}=\frac{10\times 9\times 8\times 7}{4\times 3\times 2\times 1}=210\),然而這樣是錯誤的

考慮是什麼地方出了問題

剛才我們說,任取四個點一定能保證它們構成一個環

但是環 1 2 3 4 和環 2 1 3 4 並不是同一個環,前者有 1->2->3 的連邊,後者有 2->1->3 的連邊,顯然不是同一個環

正確的做法是考慮重複的環:

注意到 1 2 3 4 2 3 4 1 3 4 1 2 4 1 2 3 是重複的,以此類推,每一種可能的組合都有四種可能的起始節點,因此會重複計算 \(4\)

另外,注意到 1 2 3 4 4 3 2 1 是重複的,同樣,上面的每一種反過來和原來都是一樣的,因此答案為 \(\frac{A^{4}_{10}}{2\times 4}=630\)

13

對於一個整數 \(n\)。定義 \(f(n)\)\(n\) 的各位數字之和。問使 \(f(f(x))=10\) 的最小自然數 \(x\) 是多少?

A \(29\)
B \(199\)
C \(299\)
D \(399\)

代選項即可

\(f(29)=11,f(f(29))=2\)

\(f(199)=19,f(f(199))=10\)

\(f(299)=20,f(f(299))=2\)

\(f(399)=21,f(f(399))=3\)

14

設有一個長度為 \(n\) 的 01 字串,其中有 \(k\)\(1\) ,每次操作可以交換相鄰兩個字元。在最壞情況下將這 \(k\)\(1\) 移到字串最右邊所要的交換次數是多少?

A \(k\)
B \(\frac{k\times (k-1)}{2}\)
C \((n-k)\times k\)
D \(\frac{(2n-k-1)\times k}{2}\)

D 這個數的來源:令全部數字都排在最左邊,然後從右到左一個一個挪,然後認為答案是 \((n-1)+(n-2)+(n-3)\cdots+(n-k)\)

實際上,在排後面的數字時,由於右邊已經有排好的數字,不需要將新來的數字與排好的數字進行比較與交換了,所以每個數字的交換次數只有 \((n-k)\) 次,一共 \(k(n-k)\)

15

如圖是一張包含 \(7\) 個頂點的有向圖,如果要除其中一些邊,使得從節點 \(1\) 到節點 \(7\) 沒有可行路徑,且刪除的邊數最少,請問總共有多少種可行的刪除邊的集合?

A \(1\)
B \(2\)
C \(3\)
D \(4\)

一個可能更醜的圖

上來先注意到 \(\{8,9\}\) 是合法的,並且不存在只刪一個邊的解法,因此最優解為 \(2\)

可行的邊的集合

\(\{8,9\}\)
\(\{5,6\}\)
\(\{6,8\}\)
\(\{1,6\}\)

閱讀程式

本解析不提供原始題目程式,如有需要請透過 luogu.com.cn 相關連結 下載

1

分析

logic() 函式內的位運算,採用列舉法來判斷

  1. \(x=0,y=0\) 時,(0 & 0) ^ ((0 ^ 0) | (~0 & 0))=0 ^ (0 | 0)=0
  2. \(x=0,y=1\) 時,(0 & 1) ^ ((0 ^ 1) | (~0 & 1))=0 ^ (1 | 1)=1
  3. \(x=1,y=0\) 時,(1 & 0) ^ ((1 ^ 0) | (~1 & 0))=0 ^ (1 | 0)=1
  4. \(x=1,y=1\) 時,(1 & 1) ^ ((1 ^ 1) | (~1 & 1))=1 ^ (0 | 0)=1

因此為邏輯或運算

題目

  • \(1000\ge d\ge b\) 時,輸出的序列是有序的

相關文章