6 · CSP 2023 入门级第一轮

CSP 2023 · 共 42 题 · 建议用时 60 分钟
开始整卷作答 按大题分页,翻页自动存草稿,做完统一交卷。
## 一、单项选择题(共 $15$ 题,每题 $2$ 分,共计 $30$ 分;每题有且仅有一个正确选项) 第 1–15 题 · 共 15 题
### 判断题 第 16–18 题 · 共 3 题
### 单选题 第 19–20 题 · 共 2 题
### 判断题 第 21–23 题 · 共 3 题
### 单选题 第 24–26 题 · 共 3 题
### 判断题 第 27–29 题 · 共 3 题
### 单选题 第 30–32 题 · 共 3 题
## 三、完善程序(单选题,每小题 $3$ 分,共计 $30$ 分) 第 33–33 题 · 共 1 题
## 三、完善程序(单选题,每小题 $3$ 分,共计 $30$ 分) 1. (寻找被移除的元素)问题: 原有长度为 $n+1$ 公差为 $1$ 等差数列,将数列输到程序的数组时移除了一个元素,导致长度为 $n$ 的连续数组可能不再连续,除非被移除的是第一个或最后一个元素。需要在数组不连续时,找出被移除的元素。试补全程序。 ```cpp #include <iostream> #include <vector> using namespace std; int find_missing(vector<int>& nums) { int left = 0, right = nums.size() - 1; while (left < right){ int mid = left + (right - left) / 2; if (nums[mid] == mid + ①) { ②; } else { ③; } } return ④; } int main() { int n; cin >> n; vector<int> nums(n); for (int i = 0; i < n; i++) cin >> nums[i]; int missing_number = find_missing(nums); if (missing_number == ⑤) { cout << "Sequence is consecutive" << endl; }else{ cout << "Missing number is " << missing_number << endl; } return 0; } ``` 第 34–37 题 · 共 4 题
## 三、完善程序(单选题,每小题 $3$ 分,共计 $30$ 分) 第 38–38 题 · 共 1 题
2. (编辑距离)给定两个字符串,每次操作可以选择删除(Delete)、插入(Insert)、替换(Replace),一个字符,求将第一个字符串转换为第二个字符串所需要的最少操作次数。 ```cpp #include <iostream> #include <string> #include <vector> using namespace std; int min(int x, int y, int z) { return min(min(x, y), z); } int edit_dist_dp(string str1, string str2) { int m = str1.length(); int n = str2.length(); vector<vector<int>> dp(m + 1, vector<int>(n + 1)); for (int i = 0; i <= m; i++) { for (int j = 0; j <= n; j++) { if (i == 0) dp[i][j] = ①; else if (j == 0) dp[i][j] = ②; else if (③) dp[i][j] = ④; else dp[i][j] = 1 + min(dp[i][j - 1], dp[i - 1][j], ⑤); } } return dp[m][n]; } int main() { string str1, str2; cin >> str1 >> str2; cout << "Mininum number of operation:" << edit_dist_dp(str1, str2) << endl; return 0; } ``` 第 39–42 题 · 共 4 题
展开逐题清单(单独练某一道)
● 绿=已通过 ● 橙=做过没全对 ● 灰=没做过
## 一、单项选择题(共 $15$ 题,每题 $2$ 分,共计 $30$ 分;每题有且仅有一个正确选项)
1. [CSP2023 入门级] 第 1 题 2. [CSP2023 入门级] 第 2 题 3. [CSP2023 入门级] 第 3 题 4. [CSP2023 入门级] 第 4 题 5. [CSP2023 入门级] 第 5 题 6. [CSP2023 入门级] 第 6 题 7. [CSP2023 入门级] 第 7 题 8. [CSP2023 入门级] 第 8 题 9. [CSP2023 入门级] 第 9 题 10. [CSP2023 入门级] 第 10 题 11. [CSP2023 入门级] 第 11 题 12. [CSP2023 入门级] 第 12 题 13. [CSP2023 入门级] 第 13 题 14. [CSP2023 入门级] 第 14 题 15. [CSP2023 入门级] 第 15 题
### 判断题
16. [CSP2023 入门级] 第 16 题 17. [CSP2023 入门级] 第 17 题 18. [CSP2023 入门级] 第 18 题
### 单选题
19. [CSP2023 入门级] 第 19 题 20. [CSP2023 入门级] 第 20 题
### 判断题
21. [CSP2023 入门级] 第 21 题 22. [CSP2023 入门级] 第 22 题 23. [CSP2023 入门级] 第 23 题
### 单选题
24. [CSP2023 入门级] 第 24 题 25. [CSP2023 入门级] 第 25 题 26. [CSP2023 入门级] 第 26 题
### 判断题
27. [CSP2023 入门级] 第 27 题 28. [CSP2023 入门级] 第 28 题 29. [CSP2023 入门级] 第 29 题
### 单选题
30. [CSP2023 入门级] 第 30 题 31. [CSP2023 入门级] 第 31 题 32. [CSP2023 入门级] 第 32 题
## 三、完善程序(单选题,每小题 $3$ 分,共计 $30$ 分)
33. [CSP2023 入门级] 第 33 题
## 三、完善程序(单选题,每小题 $3$ 分,共计 $30$ 分) 1. (寻找被移除的元素)问题: 原有长度为 $n+1$ 公差为 $1$ 等差数列,将数列输到程序的数组时移除了一个元素,导致长度为 $n$ 的连续数组可能不再连续,除非被移除的是第一个或最后一个元素。需要在数组不连续时,找出被移除的元素。试补全程序。 ```cpp #include <iostream> #include <vector> using namespace std; int find_missing(vector<int>& nums) { int left = 0, right = nums.size() - 1; while (left < right){ int mid = left + (right - left) / 2; if (nums[mid] == mid + ①) { ②; } else { ③; } } return ④; } int main() { int n; cin >> n; vector<int> nums(n); for (int i = 0; i < n; i++) cin >> nums[i]; int missing_number = find_missing(nums); if (missing_number == ⑤) { cout << "Sequence is consecutive" << endl; }else{ cout << "Missing number is " << missing_number << endl; } return 0; } ```
34. [CSP2023 入门级] 第 34 题 35. [CSP2023 入门级] 第 35 题 36. [CSP2023 入门级] 第 36 题 37. [CSP2023 入门级] 第 37 题
## 三、完善程序(单选题,每小题 $3$ 分,共计 $30$ 分)
38. [CSP2023 入门级] 第 38 题
2. (编辑距离)给定两个字符串,每次操作可以选择删除(Delete)、插入(Insert)、替换(Replace),一个字符,求将第一个字符串转换为第二个字符串所需要的最少操作次数。 ```cpp #include <iostream> #include <string> #include <vector> using namespace std; int min(int x, int y, int z) { return min(min(x, y), z); } int edit_dist_dp(string str1, string str2) { int m = str1.length(); int n = str2.length(); vector<vector<int>> dp(m + 1, vector<int>(n + 1)); for (int i = 0; i <= m; i++) { for (int j = 0; j <= n; j++) { if (i == 0) dp[i][j] = ①; else if (j == 0) dp[i][j] = ②; else if (③) dp[i][j] = ④; else dp[i][j] = 1 + min(dp[i][j - 1], dp[i - 1][j], ⑤); } } return dp[m][n]; } int main() { string str1, str2; cin >> str1 >> str2; cout << "Mininum number of operation:" << edit_dist_dp(str1, str2) << endl; return 0; } ```
39. [CSP2023 入门级] 第 39 题 40. [CSP2023 入门级] 第 40 题 41. [CSP2023 入门级] 第 41 题 42. [CSP2023 入门级] 第 42 题