151 · 珅泽教育CSP-J第一轮模拟考第八套

历年真题 · 共 45 题 · 建议用时 60 分钟
开始整卷作答 按大题分页,翻页自动存草稿,做完统一交卷。
## 一、单项选择题(共15题,每题2分,共计30分) 第 1–15 题 · 共 15 题
## 二、阅读程序(判断题1分,选择题3分,共计40分) 判断题正确填 `T`,错误填 `F`。 ### 第1题 ```cpp void solve1(int n) { if (n == 0) return; int lowbit = n & 1; solve1((n - lowbit) / -2); std::cout << lowbit; } void solve2(int n) { int a[100]; int size = 0; while (n != 0) { int lowbit = n % 2; if (lowbit == -1) lowbit = 1; a[size++] = lowbit; n = (n - lowbit) / -2; } if (size == 0) { std::cout << 0; } else { while (size > 0) { int highbit = a[--size]; std::cout << highbit; } } } ``` 保证 `solve1` 与 `solve2` 的参数 `n` 是整数。 判断题 第 16–17 题 · 共 2 题
选择题 第 18–20 题 · 共 3 题
### 第2题 ```cpp int solve(int n, int a[]) { std::sort(a, a + n); int half = n / 2; int j = half; int pair = 0; for (int i = 0; i < half; ++i) { while (j < n && a[i] * 2 > a[j]) { j++; } if (j < n) { pair++; j++; } } return pair; } ``` 判断题 第 21–24 题 · 共 4 题
选择题 第 25–27 题 · 共 3 题
### 第三题 ```cpp struct hash_map { const int max_size = 32767; struct node { int key; int value; int next; } map[max_size * 4]; int size = 0; int hash[max_size] = {0}; int& operator[] (int key) { int code = key % max_size; int addr = hash[code]; while (addr > 0) { if (map[addr].key == key) return map[addr].value; else addr = map[addr].next; } ++size; map[size].key = key; map[size].value = 0; map[size].next = hash[code]; hash[code] = size; return map[size].value; } }; void test(int q) { hash_map map; while (q > 0) { --q; char op; std::cin >> op; if (op == '+') { int key, value; std::cin >> key >> value; map[key] = value; } if (op == '?') { int key; std::cin >> key; std::cout << map[key] << "\n"; } } } ``` 判断题 第 28–31 题 · 共 4 题
选择题 第 32–35 题 · 共 4 题
## 三、完善程序(单选题,每小题3分,共计30分) ### 第1题 `solve(int n, int a[])` 解决的问题是:给定 $n$ 个整数 $a_1,a_2,\ldots,a_n$,每个数字都是 $0,1,2$ 中的一个。不断交换这个序列中的任意两个数字,让这个序列成为升序,函数返回最少需要的交换次数。 ```cpp int cal(int q[3][3], int u, int v) { int pair = std::min(____(1)____); q[u][v] -= pair; q[v][u] -= pair; return pair; } int solve(int n, int a[]) { int c[3] = {0, 0, 0}; for (int i = 0; i < n; ++i) { ____(2)____; } int q[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}; for (int i = 0; i < n; ++i) { int from = ____(3)____; int to; if (i < c[0]) to = 0; else if (i < ____(4)____) to = 1; else to = 2; q[from][to]++; } int sum = 0; sum += cal(q, 0, 1); sum += cal(q, 0, 2); sum += cal(q, 1, 2); sum += 2 * (____(5)____); std::cout << sum << "\n"; } ``` 第 36–40 题 · 共 5 题
### 第2题 有三种操作可以修改一个变量的值: - 增加:将变量加一; - 减少:将变量减一; - 翻倍:将变量翻倍。 函数 `solve(x, y)` 用于求解最少需要几步操作,才能将变量的值从 $x$ 变成 $y$。 ```cpp std::map<int, int> mem; int solve(int x, int y) { int base = std::max(x - y, y - x); if (____(1)____) return ____(2)____; if (____(3)____) return mem[y]; int reduce; if (____(4)____) { reduce = ____(5)____; } else { reduce = std::____(6)____; } mem[y] = std::____(7)____; return mem[y]; } ``` 第 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 solve1(int n) { if (n == 0) return; int lowbit = n & 1; solve1((n - lowbit) / -2); std::cout << lowbit; } void solve2(int n) { int a[100]; int size = 0; while (n != 0) { int lowbit = n % 2; if (lowbit == -1) lowbit = 1; a[size++] = lowbit; n = (n - lowbit) / -2; } if (size == 0) { std::cout << 0; } else { while (size > 0) { int highbit = a[--size]; std::cout << highbit; } } } ``` 保证 `solve1` 与 `solve2` 的参数 `n` 是整数。 判断题
16. 珅泽教育CSP-J第一轮模拟考第八套 第 16 题 17. 珅泽教育CSP-J第一轮模拟考第八套 第 17 题
选择题
18. 珅泽教育CSP-J第一轮模拟考第八套 第 18 题 19. 珅泽教育CSP-J第一轮模拟考第八套 第 19 题 20. 珅泽教育CSP-J第一轮模拟考第八套 第 20 题
### 第2题 ```cpp int solve(int n, int a[]) { std::sort(a, a + n); int half = n / 2; int j = half; int pair = 0; for (int i = 0; i < half; ++i) { while (j < n && a[i] * 2 > a[j]) { j++; } if (j < n) { pair++; j++; } } return pair; } ``` 判断题
21. 珅泽教育CSP-J第一轮模拟考第八套 第 21 题 22. 珅泽教育CSP-J第一轮模拟考第八套 第 22 题 23. 珅泽教育CSP-J第一轮模拟考第八套 第 23 题 24. 珅泽教育CSP-J第一轮模拟考第八套 第 24 题
选择题
25. 珅泽教育CSP-J第一轮模拟考第八套 第 25 题 26. 珅泽教育CSP-J第一轮模拟考第八套 第 26 题 27. 珅泽教育CSP-J第一轮模拟考第八套 第 27 题
### 第三题 ```cpp struct hash_map { const int max_size = 32767; struct node { int key; int value; int next; } map[max_size * 4]; int size = 0; int hash[max_size] = {0}; int& operator[] (int key) { int code = key % max_size; int addr = hash[code]; while (addr > 0) { if (map[addr].key == key) return map[addr].value; else addr = map[addr].next; } ++size; map[size].key = key; map[size].value = 0; map[size].next = hash[code]; hash[code] = size; return map[size].value; } }; void test(int q) { hash_map map; while (q > 0) { --q; char op; std::cin >> op; if (op == '+') { int key, value; std::cin >> key >> value; map[key] = value; } if (op == '?') { int key; std::cin >> key; std::cout << map[key] << "\n"; } } } ``` 判断题
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题 `solve(int n, int a[])` 解决的问题是:给定 $n$ 个整数 $a_1,a_2,\ldots,a_n$,每个数字都是 $0,1,2$ 中的一个。不断交换这个序列中的任意两个数字,让这个序列成为升序,函数返回最少需要的交换次数。 ```cpp int cal(int q[3][3], int u, int v) { int pair = std::min(____(1)____); q[u][v] -= pair; q[v][u] -= pair; return pair; } int solve(int n, int a[]) { int c[3] = {0, 0, 0}; for (int i = 0; i < n; ++i) { ____(2)____; } int q[3][3] = {{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}; for (int i = 0; i < n; ++i) { int from = ____(3)____; int to; if (i < c[0]) to = 0; else if (i < ____(4)____) to = 1; else to = 2; q[from][to]++; } int sum = 0; sum += cal(q, 0, 1); sum += cal(q, 0, 2); sum += cal(q, 1, 2); sum += 2 * (____(5)____); std::cout << sum << "\n"; } ```
36. 珅泽教育CSP-J第一轮模拟考第八套 第 36 题 37. 珅泽教育CSP-J第一轮模拟考第八套 第 37 题 38. 珅泽教育CSP-J第一轮模拟考第八套 第 38 题 39. 珅泽教育CSP-J第一轮模拟考第八套 第 39 题 40. 珅泽教育CSP-J第一轮模拟考第八套 第 40 题
### 第2题 有三种操作可以修改一个变量的值: - 增加:将变量加一; - 减少:将变量减一; - 翻倍:将变量翻倍。 函数 `solve(x, y)` 用于求解最少需要几步操作,才能将变量的值从 $x$ 变成 $y$。 ```cpp std::map<int, int> mem; int solve(int x, int y) { int base = std::max(x - y, y - x); if (____(1)____) return ____(2)____; if (____(3)____) return mem[y]; int reduce; if (____(4)____) { reduce = ____(5)____; } else { reduce = std::____(6)____; } mem[y] = std::____(7)____; return mem[y]; } ```
41. 珅泽教育CSP-J第一轮模拟考第八套 第 41 题 42. 珅泽教育CSP-J第一轮模拟考第八套 第 42 题 43. 珅泽教育CSP-J第一轮模拟考第八套 第 43 题 44. 珅泽教育CSP-J第一轮模拟考第八套 第 44 题 45. 珅泽教育CSP-J第一轮模拟考第八套 第 45 题