开始整卷作答
按大题分页,翻页自动存草稿,做完统一交卷。
## 一、单项选择题(共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 题