112 · 珅泽教育CSP-J第一轮模拟考第十二套

历年真题 · 共 47 题 · 建议用时 60 分钟
开始整卷作答 按大题分页,翻页自动存草稿,做完统一交卷。
## 一、单项选择题(共计 $30$ 分) 第 1–15 题 · 共 15 题
## 二、阅读程序(共计 40 分) 判断题 $1$ 分,选择题 $3$ 分,共计 $40$ 分。 判断题正确填 `T`,错误填 `F`。 ### 第1题 ```cpp bool check(int n, int a[]) { bool found = false; for (int i = 0; i + 1 < n; ++i) { if (a[i] > a[i+1]) { found = true; auto temp = a[i]; a[i] = a[i+1]; a[i+1] = temp; } } return found; } void solve(int n, int a[]) { while (check(n, a)) ; } ``` 判断题 第 16–20 题 · 共 5 题
选择题 第 21–23 题 · 共 3 题
### 第2题 ```cpp bool move(int b[], int n) { for (int i = 0; i < n; ++i) { if (b[i] == 1) { b[i] = 0; } else { b[i] = 1; return true; } } return false; } void print(int n) { int b[n]; for (int i = 0; i < n; ++i) b[i] = 0; do { for (int i = 0; i < n; ++i) std::cout << b[i]; std::cout << "\n"; } while (move(b, n)); } int count(int n) { int b[100]; for (int i = 0; i < n; ++i) b[i] = 0; int c = 0; do { c++; } while (move(b, n)); return c; } ``` 判断题 第 24–27 题 · 共 4 题
### 第2题(续) #### 选择题 第 28–30 题 · 共 3 题
### 第3题 ```cpp const int mod = 1'000'000'007; bool filled[maxn][maxn]; int mem[maxn][maxn]; int solve(int i, int j, int a[], int b[]) { if (i == 0 || j == 0) { return 1; } if (filled[i][j]) { return mem[i][j]; } filled[i][j] = true; int sum = (solve(i - 1, j, a, b) + solve(i, j - 1, a, b)) % mod; if (a[i] == b[j]) { return mem[i][j] = sum; } else { return mem[i][j] = (sum - solve(i - 1, j - 1, a, b)) % mod; } } ``` #### 判断题 第 31–34 题 · 共 4 题
#### 选择题 第 35–37 题 · 共 3 题
## 三、完善程序(共计 $30$ 分) 单项选择题,每小题 $3$ 分。 ### 第1题 套餐限价 有一家快餐店,出售 $N$ 种主食,其价格以数组 `A[0..N)` 表示,出售 $M$ 种饮料,其价格以数组 `B[0..M)` 表示。 现推出一种促销活动:顾客可以任选主食及饮料各一份形成套餐,若套餐价格超过一个给定的最高价格 $L$,则这份套餐只收取 $L$ 元。 请计算,若顾客购买所有食物与饮料的搭配(共有 $N\times M$ 种),需要花多少钱。 ```cpp long long S[MAXN]; long long solve(int N, int M, int L, int A[], int B[]) { std::sort(A, A + ____(1)____); std::sort(B, B + M); S[0] = 0; for (int i = 0; i < M; ++i) { S[i + 1] = S[i] + B[i]; } long long j = ____(2)____; long long sum = 0; for (int i = 0; i < N; ++i) { while (____(3)____ && A[i] + B[j - 1] > L) { j--; } sum += (A[i] * ____(4)____); sum += S[____(5)____]; sum += (M - j) * L; } return sum; } ``` 第 38–42 题 · 共 5 题
### 第2题 给定 $N$ 个点、$M$ 条边,构成一个图。请统计从 $1$ 号出发,有多少条简单路径。所谓简单路径,就是路径上的所有点及所有边不会重复出现两次。如果路径超过 $1024$ 条,则输出 $-1$。 ```cpp #include <iostream> #include <vector> int N, M; std::vector<int> adj[200001]; // 邻接表 bool visited[200001]; const int limit = 1024; int cnt = 0; void dfs(int node) { ____(1)____; if (cnt > limit) return; visited[node] = ____(2)____; for (auto v : ____(3)____) { if (not visited[v]) { dfs(____(4)____); } } visited[node] = ____(5)____; } int main() { std::cin >> N >> M; for (int i = 0; i < M; ++i) { int A, B; std::cin >> A >> B; adj[A].push_back(B); adj[B].push_back(A); } dfs(____(6)____); if (cnt > limit) { std::cout << -1 << "\n"; } else { std::cout << cnt << "\n"; } } ``` 第 43–47 题 · 共 5 题
展开逐题清单(单独练某一道)
● 绿=已通过 ● 橙=做过没全对 ● 灰=没做过
## 一、单项选择题(共计 $30$ 分)
1. 珅泽教育CSP-J第一轮模拟考第十二套 第 1 题 2. 珅泽教育CSP-J第一轮模拟考第十二套 第 2 题 3. 珅泽教育CSP-J第一轮模拟考第十二套 第 3 题 4. 珅泽教育CSP-J第一轮模拟考第十二套 第 4 题 5. 珅泽教育CSP-J第一轮模拟考第十二套 第 5 题 6. 珅泽教育CSP-J第一轮模拟考第十二套 第 6 题 7. 珅泽教育CSP-J第一轮模拟考第十二套 第 7 题 8. 珅泽教育CSP-J第一轮模拟考第十二套 第 8 题 9. 珅泽教育CSP-J第一轮模拟考第十二套 第 9 题 10. 珅泽教育CSP-J第一轮模拟考第十二套 第 10 题 11. 珅泽教育CSP-J第一轮模拟考第十二套 第 11 题 12. 珅泽教育CSP-J第一轮模拟考第十二套 第 12 题 13. 珅泽教育CSP-J第一轮模拟考第十二套 第 13 题 14. 珅泽教育CSP-J第一轮模拟考第十二套 第 14 题 15. 珅泽教育CSP-J第一轮模拟考第十二套 第 15 题
## 二、阅读程序(共计 40 分) 判断题 $1$ 分,选择题 $3$ 分,共计 $40$ 分。 判断题正确填 `T`,错误填 `F`。 ### 第1题 ```cpp bool check(int n, int a[]) { bool found = false; for (int i = 0; i + 1 < n; ++i) { if (a[i] > a[i+1]) { found = true; auto temp = a[i]; a[i] = a[i+1]; a[i+1] = temp; } } return found; } void solve(int n, int a[]) { while (check(n, a)) ; } ``` 判断题
16. 珅泽教育CSP-J第一轮模拟考第十二套 第 16 题 17. 珅泽教育CSP-J第一轮模拟考第十二套 第 17 题 18. 珅泽教育CSP-J第一轮模拟考第十二套 第 18 题 19. 珅泽教育CSP-J第一轮模拟考第十二套 第 19 题 20. 珅泽教育CSP-J第一轮模拟考第十二套 第 20 题
选择题
21. 珅泽教育CSP-J第一轮模拟考第十二套 第 21 题 22. 珅泽教育CSP-J第一轮模拟考第十二套 第 22 题 23. 珅泽教育CSP-J第一轮模拟考第十二套 第 23 题
### 第2题 ```cpp bool move(int b[], int n) { for (int i = 0; i < n; ++i) { if (b[i] == 1) { b[i] = 0; } else { b[i] = 1; return true; } } return false; } void print(int n) { int b[n]; for (int i = 0; i < n; ++i) b[i] = 0; do { for (int i = 0; i < n; ++i) std::cout << b[i]; std::cout << "\n"; } while (move(b, n)); } int count(int n) { int b[100]; for (int i = 0; i < n; ++i) b[i] = 0; int c = 0; do { c++; } while (move(b, n)); return c; } ``` 判断题
24. 珅泽教育CSP-J第一轮模拟考第十二套 第 24 题 25. 珅泽教育CSP-J第一轮模拟考第十二套 第 25 题 26. 珅泽教育CSP-J第一轮模拟考第十二套 第 26 题 27. 珅泽教育CSP-J第一轮模拟考第十二套 第 27 题
### 第2题(续) #### 选择题
28. 珅泽教育CSP-J第一轮模拟考第十二套 第 28 题 29. 珅泽教育CSP-J第一轮模拟考第十二套 第 29 题 30. 珅泽教育CSP-J第一轮模拟考第十二套 第 30 题
### 第3题 ```cpp const int mod = 1'000'000'007; bool filled[maxn][maxn]; int mem[maxn][maxn]; int solve(int i, int j, int a[], int b[]) { if (i == 0 || j == 0) { return 1; } if (filled[i][j]) { return mem[i][j]; } filled[i][j] = true; int sum = (solve(i - 1, j, a, b) + solve(i, j - 1, a, b)) % mod; if (a[i] == b[j]) { return mem[i][j] = sum; } else { return mem[i][j] = (sum - solve(i - 1, j - 1, a, b)) % mod; } } ``` #### 判断题
31. 珅泽教育CSP-J第一轮模拟考第十二套 第 31 题 32. 珅泽教育CSP-J第一轮模拟考第十二套 第 32 题 33. 珅泽教育CSP-J第一轮模拟考第十二套 第 33 题 34. 珅泽教育CSP-J第一轮模拟考第十二套 第 34 题
#### 选择题
35. 珅泽教育CSP-J第一轮模拟考第十二套 第 35 题 36. 珅泽教育CSP-J第一轮模拟考第十二套 第 36 题 37. 珅泽教育CSP-J第一轮模拟考第十二套 第 37 题
## 三、完善程序(共计 $30$ 分) 单项选择题,每小题 $3$ 分。 ### 第1题 套餐限价 有一家快餐店,出售 $N$ 种主食,其价格以数组 `A[0..N)` 表示,出售 $M$ 种饮料,其价格以数组 `B[0..M)` 表示。 现推出一种促销活动:顾客可以任选主食及饮料各一份形成套餐,若套餐价格超过一个给定的最高价格 $L$,则这份套餐只收取 $L$ 元。 请计算,若顾客购买所有食物与饮料的搭配(共有 $N\times M$ 种),需要花多少钱。 ```cpp long long S[MAXN]; long long solve(int N, int M, int L, int A[], int B[]) { std::sort(A, A + ____(1)____); std::sort(B, B + M); S[0] = 0; for (int i = 0; i < M; ++i) { S[i + 1] = S[i] + B[i]; } long long j = ____(2)____; long long sum = 0; for (int i = 0; i < N; ++i) { while (____(3)____ && A[i] + B[j - 1] > L) { j--; } sum += (A[i] * ____(4)____); sum += S[____(5)____]; sum += (M - j) * L; } return sum; } ```
38. 珅泽教育CSP-J第一轮模拟考第十二套 第 38 题 39. 珅泽教育CSP-J第一轮模拟考第十二套 第 39 题 40. 珅泽教育CSP-J第一轮模拟考第十二套 第 40 题 41. 珅泽教育CSP-J第一轮模拟考第十二套 第 41 题 42. 珅泽教育CSP-J第一轮模拟考第十二套 第 42 题
### 第2题 给定 $N$ 个点、$M$ 条边,构成一个图。请统计从 $1$ 号出发,有多少条简单路径。所谓简单路径,就是路径上的所有点及所有边不会重复出现两次。如果路径超过 $1024$ 条,则输出 $-1$。 ```cpp #include <iostream> #include <vector> int N, M; std::vector<int> adj[200001]; // 邻接表 bool visited[200001]; const int limit = 1024; int cnt = 0; void dfs(int node) { ____(1)____; if (cnt > limit) return; visited[node] = ____(2)____; for (auto v : ____(3)____) { if (not visited[v]) { dfs(____(4)____); } } visited[node] = ____(5)____; } int main() { std::cin >> N >> M; for (int i = 0; i < M; ++i) { int A, B; std::cin >> A >> B; adj[A].push_back(B); adj[B].push_back(A); } dfs(____(6)____); if (cnt > limit) { std::cout << -1 << "\n"; } else { std::cout << cnt << "\n"; } } ```
43. 珅泽教育CSP-J第一轮模拟考第十二套 第 43 题 44. 珅泽教育CSP-J第一轮模拟考第十二套 第 44 题 45. 珅泽教育CSP-J第一轮模拟考第十二套 第 45 题 46. 珅泽教育CSP-J第一轮模拟考第十二套 第 46 题 47. 珅泽教育CSP-J第一轮模拟考第十二套 第 47 题