130 · 珅泽教育CSP-J第一轮模拟考第九套

历年真题 · 共 45 题 · 建议用时 60 分钟
开始整卷作答 按大题分页,翻页自动存草稿,做完统一交卷。
## 一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项) 第 1–15 题 · 共 15 题
## 二、阅读程序(判断题1分,选择题3分,共计40分) 判断题正确填 `T`,错误填 `F`。 ### 第1题 ```cpp void solve(int n, int a[]) { while (true) { bool found = false; for (int i = 0; i + 1 < n; ++i) { if (a[i] > a[i+1]) { found = true; int temp = a[i]; a[i] = a[i + 1]; a[i + 1] = temp; } } if (not found) { break; } } } ``` #### 判断题 第 16–19 题 · 共 4 题
#### 选择题 第 20–22 题 · 共 3 题
### 第2题 ```cpp long long solve(long long n) { long long c = 0; long long p = 1; long long t = 0; while (n > 0) { int d = n % 10; n /= 10; if (d > 0) { c += n * p; } else { c += (n-1) * p; c += t + 1; } t += d * p; p *= 10; } return c; } ``` #### 判断题 第 23–24 题 · 共 2 题
#### 选择题 第 25–27 题 · 共 3 题
### 第三题 ```cpp #include<iostream> int n, q; char op[200000]; long long p[200000]; long long d[200000]; long long mod = 1000000007; void solve1(long long a[]) { for (int i = 0; i < n; ++i) a[i] = 0; for (int i = 0; i < q; ++i) { if (op[i] == '+') { a[p[i]] += d[i]; a[p[i]] %= mod; } else if (op[i] == '*') { for (int j = 0; j < n; ++j) { a[j] *= d[i]; a[j] %= mod; } } } } void solve2(long long a[]) { for (int i = 0; i < n; ++i) a[i] = 0; long long f = 1; for (int i = q-1; i >= 0; i--) { if (op[i] == '+') { a[p[i]] += d[i] * f; a[p[i]] %= mod; } else if (op[i] == '*') { f *= d[i]; f %= mod; } } } ``` #### 判断题 第 28–31 题 · 共 4 题
#### 选择题 第 32–35 题 · 共 4 题
## 三、完善程序(单选题,每小题3分,共计30分) ### 第1题 炼制一块合金,该合金需要 $a$ 克黄金与 $b$ 克白银。商店里有 $n$ 块材料,第 $i$ 块材料含有 $x_i$ 克黄金与 $y_i$ 克白银,且含有 $w_i$ 克杂质。 请问应该使用哪些材料,将它们炼制在一起,才能使得合金中黄金与白银含量不少于给定的要求,且杂质总和最小。所有材料均不可切割。输入数据保证所要求的合金一定可以炼成。 ```cpp int n, a, b; int x[maxn], y[maxn], w[maxn]; int mem[maxn][maxm][maxm]; bool cache[maxn][maxm][maxm]; const int INF = 1000000000; int dfs(int k, int i, int j) { if (____(1)____) return 0; if (____(2)____) return INF; if (cache[k][i][j]) return mem[k][i][j]; int ni = ____(3)____; int nj = ____(4)____; int giveup = ____(5)____; int pickup = ____(6)____; cache[k][i][j] = true; return mem[k][i][j] = std::min(giveup,pickup); } int main() { std::cin >> n >> a >> b; for (int i = 0; i < n; ++i) std::cin >> x[i] >> y[i] >> w[i]; std::cout << ____(7)____ << "\n"; return 0; } ``` 第 36–40 题 · 共 5 题
### 第2题 给定一个整数序列 $a_1,a_2,\ldots,a_n$,对该序列的所有子区间,分别算出它们的中位数,并且将这些中位数组成一个新序列,输出这个新序列的中位数。 所谓一个序列的中位数,就是将这个序列排序后,排名在最中间的数字,如果序列的长度是偶数,规定中位数是排名最居中的两个数之中偏大的数。 ```cpp #include<iostream> const int maxn = 1000000; int a[maxn]; int b[maxn]; int s[maxn + 1]; int n; long long total; long long merge(int begin, int mid, int end) { int buffer[end - begin]; auto i = begin; auto j = mid; auto k = 0; long long sum = 0; while (i < mid and j < end) { if (s[i] <= s[j]) { buffer[k++] = s[i++]; sum += ____(1)____; } else { buffer[k++] = s[j++]; } } while (i < mid) buffer[k++] = s[i++]; while (j < end) buffer[k++] = s[j++]; for (int x = begin, k = 0; x < end; ++x, ++k) s[x] = buffer[k]; return sum; } long long merge_sort(int begin, int end) { auto length = end - begin; if (____(2)____) return 0; auto mid = begin + length / 2; auto front = merge_sort(begin, mid); auto back = merge_sort(mid, end); auto cross = merge(begin, mid, end); return ____(3)____; } bool predicate(int key) { for (int i = 0; i < n; ++i) { if (____(4)____) b[i] = 1; else b[i] = -1; s[i+1] = s[i] + b[i]; } long long num = ____(5)____; return ____(6)____; } int main() { std::cin >> n; for (int i = 0; i < n; ++i) std::cin >> a[i]; total = (long long)n * (n + 1) / 2; int begin = 0; int end = 1000000001; while (true) { int length = ____(7)____; if (length == 1) break; auto mid = ____(8)____; if (predicate(mid)) begin = mid; else end = mid; } std::cout << ____(9)____ << "\n"; } ``` 第 41–45 题 · 共 5 题
展开逐题清单(单独练某一道)
● 绿=已通过 ● 橙=做过没全对 ● 灰=没做过
## 一、单项选择题(共15题,每题2分,共计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 题
## 二、阅读程序(判断题1分,选择题3分,共计40分) 判断题正确填 `T`,错误填 `F`。 ### 第1题 ```cpp void solve(int n, int a[]) { while (true) { bool found = false; for (int i = 0; i + 1 < n; ++i) { if (a[i] > a[i+1]) { found = true; int temp = a[i]; a[i] = a[i + 1]; a[i + 1] = temp; } } if (not found) { break; } } } ``` #### 判断题
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 题
### 第2题 ```cpp long long solve(long long n) { long long c = 0; long long p = 1; long long t = 0; while (n > 0) { int d = n % 10; n /= 10; if (d > 0) { c += n * p; } else { c += (n-1) * p; c += t + 1; } t += d * p; p *= 10; } return c; } ``` #### 判断题
23. 珅泽教育CSP-J第一轮模拟考第九套 第 23 题 24. 珅泽教育CSP-J第一轮模拟考第九套 第 24 题
#### 选择题
25. 珅泽教育CSP-J第一轮模拟考第九套 第 25 题 26. 珅泽教育CSP-J第一轮模拟考第九套 第 26 题 27. 珅泽教育CSP-J第一轮模拟考第九套 第 27 题
### 第三题 ```cpp #include<iostream> int n, q; char op[200000]; long long p[200000]; long long d[200000]; long long mod = 1000000007; void solve1(long long a[]) { for (int i = 0; i < n; ++i) a[i] = 0; for (int i = 0; i < q; ++i) { if (op[i] == '+') { a[p[i]] += d[i]; a[p[i]] %= mod; } else if (op[i] == '*') { for (int j = 0; j < n; ++j) { a[j] *= d[i]; a[j] %= mod; } } } } void solve2(long long a[]) { for (int i = 0; i < n; ++i) a[i] = 0; long long f = 1; for (int i = q-1; i >= 0; i--) { if (op[i] == '+') { a[p[i]] += d[i] * f; a[p[i]] %= mod; } else if (op[i] == '*') { f *= d[i]; f %= mod; } } } ``` #### 判断题
28. 珅泽教育CSP-J第一轮模拟考第九套 第 28 题 29. 珅泽教育CSP-J第一轮模拟考第九套 第 29 题 30. 珅泽教育CSP-J第一轮模拟考第九套 第 30 题 31. 珅泽教育CSP-J第一轮模拟考第九套 第 31 题
#### 选择题
32. 珅泽教育CSP-J第一轮模拟考第九套 第 32 题 33. 珅泽教育CSP-J第一轮模拟考第九套 第 33 题 34. 珅泽教育CSP-J第一轮模拟考第九套 第 34 题 35. 珅泽教育CSP-J第一轮模拟考第九套 第 35 题
## 三、完善程序(单选题,每小题3分,共计30分) ### 第1题 炼制一块合金,该合金需要 $a$ 克黄金与 $b$ 克白银。商店里有 $n$ 块材料,第 $i$ 块材料含有 $x_i$ 克黄金与 $y_i$ 克白银,且含有 $w_i$ 克杂质。 请问应该使用哪些材料,将它们炼制在一起,才能使得合金中黄金与白银含量不少于给定的要求,且杂质总和最小。所有材料均不可切割。输入数据保证所要求的合金一定可以炼成。 ```cpp int n, a, b; int x[maxn], y[maxn], w[maxn]; int mem[maxn][maxm][maxm]; bool cache[maxn][maxm][maxm]; const int INF = 1000000000; int dfs(int k, int i, int j) { if (____(1)____) return 0; if (____(2)____) return INF; if (cache[k][i][j]) return mem[k][i][j]; int ni = ____(3)____; int nj = ____(4)____; int giveup = ____(5)____; int pickup = ____(6)____; cache[k][i][j] = true; return mem[k][i][j] = std::min(giveup,pickup); } int main() { std::cin >> n >> a >> b; for (int i = 0; i < n; ++i) std::cin >> x[i] >> y[i] >> w[i]; std::cout << ____(7)____ << "\n"; return 0; } ```
36. 珅泽教育CSP-J第一轮模拟考第九套 第 36 题 37. 珅泽教育CSP-J第一轮模拟考第九套 第 37 题 38. 珅泽教育CSP-J第一轮模拟考第九套 第 38 题 39. 珅泽教育CSP-J第一轮模拟考第九套 第 39 题 40. 珅泽教育CSP-J第一轮模拟考第九套 第 40 题
### 第2题 给定一个整数序列 $a_1,a_2,\ldots,a_n$,对该序列的所有子区间,分别算出它们的中位数,并且将这些中位数组成一个新序列,输出这个新序列的中位数。 所谓一个序列的中位数,就是将这个序列排序后,排名在最中间的数字,如果序列的长度是偶数,规定中位数是排名最居中的两个数之中偏大的数。 ```cpp #include<iostream> const int maxn = 1000000; int a[maxn]; int b[maxn]; int s[maxn + 1]; int n; long long total; long long merge(int begin, int mid, int end) { int buffer[end - begin]; auto i = begin; auto j = mid; auto k = 0; long long sum = 0; while (i < mid and j < end) { if (s[i] <= s[j]) { buffer[k++] = s[i++]; sum += ____(1)____; } else { buffer[k++] = s[j++]; } } while (i < mid) buffer[k++] = s[i++]; while (j < end) buffer[k++] = s[j++]; for (int x = begin, k = 0; x < end; ++x, ++k) s[x] = buffer[k]; return sum; } long long merge_sort(int begin, int end) { auto length = end - begin; if (____(2)____) return 0; auto mid = begin + length / 2; auto front = merge_sort(begin, mid); auto back = merge_sort(mid, end); auto cross = merge(begin, mid, end); return ____(3)____; } bool predicate(int key) { for (int i = 0; i < n; ++i) { if (____(4)____) b[i] = 1; else b[i] = -1; s[i+1] = s[i] + b[i]; } long long num = ____(5)____; return ____(6)____; } int main() { std::cin >> n; for (int i = 0; i < n; ++i) std::cin >> a[i]; total = (long long)n * (n + 1) / 2; int begin = 0; int end = 1000000001; while (true) { int length = ____(7)____; if (length == 1) break; auto mid = ____(8)____; if (predicate(mid)) begin = mid; else end = mid; } std::cout << ____(9)____ << "\n"; } ```
41. 珅泽教育CSP-J第一轮模拟考第九套 第 41 题 42. 珅泽教育CSP-J第一轮模拟考第九套 第 42 题 43. 珅泽教育CSP-J第一轮模拟考第九套 第 43 题 44. 珅泽教育CSP-J第一轮模拟考第九套 第 44 题 45. 珅泽教育CSP-J第一轮模拟考第九套 第 45 题