开始整卷作答
按大题分页,翻页自动存草稿,做完统一交卷。
## 一、单项选择题(共15题,每题2分,共计30分;每题有且仅有一个正确选项)
第 1–15 题 · 共 15 题
## 二、阅读程序(判断题正确填T,错误填F;判断题1分,选择题3分,共计40分)
### 第1题
```cpp
int solve(int n, int a[], int b[])
{
std::sort(a, a + n);
std::sort(b, b + n);
int ans = std::max(a[0] - b[0], b[0] - a[0]);
int i = 0;
int j = 0;
while (i < n && j < n)
{
if (a[i] < b[j])
{
int diff = b[j] - a[i];
if (ans > diff)
ans = diff;
i++;
}
else
{
int diff = a[i] - b[j];
if (ans > diff)
ans = diff;
j++;
}
}
return ans;
}
```
#### 判断题
第 16–18 题 · 共 3 题
#### 选择题
第 19–21 题 · 共 3 题
### 第2题
```cpp
int solve(int n, int a[])
{
int ret = 0;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < i; ++j)
{
int sum = 0;
for (int k = j; k <= i; ++k)
{
sum += a[k];
}
ret += sum;
}
}
return ret;
}
```
#### 判断题
第 22–24 题 · 共 3 题
#### 选择题
第 25–28 题 · 共 4 题
### 第三题
```cpp
using std::string;
string post(const string& pre, const string& in)
{
if (pre == "") return "";
char root = pre[0];
int i = 0;
while (root != in[i]) ++i;
string left_in = in.substr(0, i);
string right_in = in.substr(i+1);
string left_pre = pre.substr(1, i);
string right_pre = pre.substr(i+1);
string left_post = post(left_pre, left_in);
string right_post = post(right_pre, right_in);
return left_post + right_post + root;
}
```
#### 判断题
第 29–32 题 · 共 4 题
#### 选择题
第 33–35 题 · 共 3 题
## 三、完善程序(单选题,每小题3分,共计30分)
### 第1题
给定 $n$ 根火柴的长度 $a_1,a_2,\cdots,a_n$,请用这些火柴围成一个面积最大的三角形。注意所有的火柴都必须用上,不得丢弃。输出最大三角形的面积。假设最大面积为 $s$,则输出 $16s^2$。$1 \le a_i \le 40$,数据保证至少有一种方案可以围成三角形。
```cpp
#include<iostream>
using i64 = long long;
int n;
int a[40];
bool mem[40][40*40][40*40];
i64 value[40][40*40][40*40];
i64 solve(int i, int x, int y, int z)
{
if (i < n)
{
if (mem ____(1)____ > 0)
return value ____(2)____;
i64 s1 = solve(i+1, x + a[i], y, z);
i64 s2 = solve(i+1, x, y + a[i], z);
i64 s3 = solve(i+1, x, y, z + a[i]);
mem[i][x][y] = true;
return value[i][x][y] = ____(3)____;
}
else
{
if ( ____(4)____ ) return 0;
i64 p = ____(5)____ ;
return ____(6)____ ;
}
}
int solve()
{
std::cin >> n;
for (int i = 0; i < n; ++i)
{
std::cin >> a[i];
}
std::cout << solve(0, 0, 0, 0);
}
```
第 36–40 题 · 共 5 题
### 第2题
给定一个 $N \times M$ 的迷宫网格(含不可通行的 `#`、可通行的 `.`、双向必传送且耗时 $0$ 的滑梯对(大写字母)、出口 `=` 和起点 `@`),从起点出发,移动相邻草地耗时 $1$,传送耗时 $0$。计算从起点到达出口所需的最短时间。
```cpp
#include<iostream>
char a[1000][1000];
int d[1000][1000];
int n, m;
int qx[1000*1000];
int qy[1000*1000];
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
int sumx[26];
int sumy[26];
void bfs(int x, int y) {
qx[0] = x;
qy[0] = y;
d[x][y] = 1;
int head = 0;
int tail = 1;
while (head < tail) {
int x = qx[____(1)____];
int y = qy[____(2)____];
____(3)____++;
for (int k = 0; k < 4; ++k) {
int nx = x + dx[k];
int ny = y + dy[k];
if (____(4)____) {
if (____(5)____) continue;
if ('A' <= a[nx][ny] and a[nx][ny] <= 'Z') {
char c = a[nx][ny];
nx = ____(6)____ ;
ny = ____(7)____ ;
}
if ( ____(8)____ ) {
d[nx][ny] = ____(9)____ ;
qx[tail] = nx;
qy[tail] = ny;
tail++;
}
}
}
}
}
int main()
{
std::cin >> n >> m;
int sx, sy, tx, ty;
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j) {
std::cin >> a[i][j];
if (a[i][j] == '@') {sx = i; sy = j;}
if (a[i][j] == '=') {tx = i; ty = j;}
if ('A' <= a[i][j] and a[i][j] <= 'Z') {
sumx[a[i][j] - 'A'] += i;
sumy[a[i][j] - 'A'] += j;
}
}
bfs(sx, sy);
std::cout << ____(10)____ << "\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 题
## 二、阅读程序(判断题正确填T,错误填F;判断题1分,选择题3分,共计40分)
### 第1题
```cpp
int solve(int n, int a[], int b[])
{
std::sort(a, a + n);
std::sort(b, b + n);
int ans = std::max(a[0] - b[0], b[0] - a[0]);
int i = 0;
int j = 0;
while (i < n && j < n)
{
if (a[i] < b[j])
{
int diff = b[j] - a[i];
if (ans > diff)
ans = diff;
i++;
}
else
{
int diff = a[i] - b[j];
if (ans > diff)
ans = diff;
j++;
}
}
return ans;
}
```
#### 判断题
16.
珅泽教育CSP-J第一轮模拟考第十套 第 16 题
17.
珅泽教育CSP-J第一轮模拟考第十套 第 17 题
18.
珅泽教育CSP-J第一轮模拟考第十套 第 18 题
#### 选择题
19.
珅泽教育CSP-J第一轮模拟考第十套 第 19 题
20.
珅泽教育CSP-J第一轮模拟考第十套 第 20 题
21.
珅泽教育CSP-J第一轮模拟考第十套 第 21 题
### 第2题
```cpp
int solve(int n, int a[])
{
int ret = 0;
for (int i = 0; i < n; ++i)
{
for (int j = 0; j < i; ++j)
{
int sum = 0;
for (int k = j; k <= i; ++k)
{
sum += a[k];
}
ret += sum;
}
}
return ret;
}
```
#### 判断题
22.
珅泽教育CSP-J第一轮模拟考第十套 第 22 题
23.
珅泽教育CSP-J第一轮模拟考第十套 第 23 题
24.
珅泽教育CSP-J第一轮模拟考第十套 第 24 题
#### 选择题
25.
珅泽教育CSP-J第一轮模拟考第十套 第 25 题
26.
珅泽教育CSP-J第一轮模拟考第十套 第 26 题
27.
珅泽教育CSP-J第一轮模拟考第十套 第 27 题
28.
珅泽教育CSP-J第一轮模拟考第十套 第 28 题
### 第三题
```cpp
using std::string;
string post(const string& pre, const string& in)
{
if (pre == "") return "";
char root = pre[0];
int i = 0;
while (root != in[i]) ++i;
string left_in = in.substr(0, i);
string right_in = in.substr(i+1);
string left_pre = pre.substr(1, i);
string right_pre = pre.substr(i+1);
string left_post = post(left_pre, left_in);
string right_post = post(right_pre, right_in);
return left_post + right_post + root;
}
```
#### 判断题
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题
给定 $n$ 根火柴的长度 $a_1,a_2,\cdots,a_n$,请用这些火柴围成一个面积最大的三角形。注意所有的火柴都必须用上,不得丢弃。输出最大三角形的面积。假设最大面积为 $s$,则输出 $16s^2$。$1 \le a_i \le 40$,数据保证至少有一种方案可以围成三角形。
```cpp
#include<iostream>
using i64 = long long;
int n;
int a[40];
bool mem[40][40*40][40*40];
i64 value[40][40*40][40*40];
i64 solve(int i, int x, int y, int z)
{
if (i < n)
{
if (mem ____(1)____ > 0)
return value ____(2)____;
i64 s1 = solve(i+1, x + a[i], y, z);
i64 s2 = solve(i+1, x, y + a[i], z);
i64 s3 = solve(i+1, x, y, z + a[i]);
mem[i][x][y] = true;
return value[i][x][y] = ____(3)____;
}
else
{
if ( ____(4)____ ) return 0;
i64 p = ____(5)____ ;
return ____(6)____ ;
}
}
int solve()
{
std::cin >> n;
for (int i = 0; i < n; ++i)
{
std::cin >> a[i];
}
std::cout << solve(0, 0, 0, 0);
}
```
36.
珅泽教育CSP-J第一轮模拟考第十套 第 36 题
37.
珅泽教育CSP-J第一轮模拟考第十套 第 37 题
38.
珅泽教育CSP-J第一轮模拟考第十套 第 38 题
39.
珅泽教育CSP-J第一轮模拟考第十套 第 39 题
40.
珅泽教育CSP-J第一轮模拟考第十套 第 40 题
### 第2题
给定一个 $N \times M$ 的迷宫网格(含不可通行的 `#`、可通行的 `.`、双向必传送且耗时 $0$ 的滑梯对(大写字母)、出口 `=` 和起点 `@`),从起点出发,移动相邻草地耗时 $1$,传送耗时 $0$。计算从起点到达出口所需的最短时间。
```cpp
#include<iostream>
char a[1000][1000];
int d[1000][1000];
int n, m;
int qx[1000*1000];
int qy[1000*1000];
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
int sumx[26];
int sumy[26];
void bfs(int x, int y) {
qx[0] = x;
qy[0] = y;
d[x][y] = 1;
int head = 0;
int tail = 1;
while (head < tail) {
int x = qx[____(1)____];
int y = qy[____(2)____];
____(3)____++;
for (int k = 0; k < 4; ++k) {
int nx = x + dx[k];
int ny = y + dy[k];
if (____(4)____) {
if (____(5)____) continue;
if ('A' <= a[nx][ny] and a[nx][ny] <= 'Z') {
char c = a[nx][ny];
nx = ____(6)____ ;
ny = ____(7)____ ;
}
if ( ____(8)____ ) {
d[nx][ny] = ____(9)____ ;
qx[tail] = nx;
qy[tail] = ny;
tail++;
}
}
}
}
}
int main()
{
std::cin >> n >> m;
int sx, sy, tx, ty;
for (int i = 0; i < n; ++i)
for (int j = 0; j < m; ++j) {
std::cin >> a[i][j];
if (a[i][j] == '@') {sx = i; sy = j;}
if (a[i][j] == '=') {tx = i; ty = j;}
if ('A' <= a[i][j] and a[i][j] <= 'Z') {
sumx[a[i][j] - 'A'] += i;
sumy[a[i][j] - 'A'] += j;
}
}
bfs(sx, sy);
std::cout << ____(10)____ << "\n";
}
```
41.
珅泽教育CSP-J第一轮模拟考第十套 第 41 题
42.
珅泽教育CSP-J第一轮模拟考第十套 第 42 题
43.
珅泽教育CSP-J第一轮模拟考第十套 第 43 题
44.
珅泽教育CSP-J第一轮模拟考第十套 第 44 题
45.
珅泽教育CSP-J第一轮模拟考第十套 第 45 题