logo AlgoBeat OnlineJudge
登录 注册

#10000. [Sleeping Cup #6] 2025 Sleeping Cup CSP-J1/S1 Mock Test

题目类型:答案提交 评测方式:文本比较
上传者: 匿名

题目描述

你需要将 43 道题目的答案分别写入 1.txt - 43.txt,其中判断题的答案为单个大写字母 TF,选择题的答案为正确选项对应的单个大写字母。

一、基础知识(共 15 小题,每小题 2 分,满分 30 分)

(一)语言入门(3 小题,6 分)

第 1 题

网络分局域网,广域网等。下列不属于网络的是()。

A. LAN
B. MAN
C. NAN
D. WAN

第 2 题

下列文件不是 C++ 源代码的是()。

A. 1.c
B. 2.cc
C. 3.c++
D. 4.cpp

第 3 题

在 2022 年,CCF 系列比赛的 C++ 版本是()。

A. C++11
B. C++14
C. C++17
D. C++20

(二)逻辑推理(3 小题,6 分)

第 4 题

在无符号 位整数运算下,C++ 中 15 & 26 + ~ 8 << 2 的结果为()。

A.
B.
C.
D.

第 5 题

已知 ,则 的个数为()。

A.
B.
C.
D.

第 6 题

已知 个有标号有权点被若干条不重复的无向边连成一棵树。定义一条边的边权为其两个端点的点权之和,设 个点的点权和为 ,点权中的最小值为 ,则该树的边权和最小为()。

A.
B.
C.
D.

(三)轻松图论(3 小题,6 分)

第 7 题

个点的有向图(没有重边自环,允许 同时存在)最多有()条边。

A.
B.
C.
D.

第 8 题

个点的无标号二叉树共()棵。

A.
B.
C.
D.

第 9 题

下面这棵二叉树的中序遍历是()。

结点 左儿子 右儿子

A. 1234567
B. 4213657
C. 1325764
D. 4261357

(四)数据结构(3 小题,6 分)

我们知道,顺序表和链表各有优劣。现在,我们考虑将 个数据均分成约 组,每组用链表串成一串,再用顺序表维护这 串数据,这便是「块状链表」了。假设某块状链表含 个数据,请完成下面三个问题。

第 10 题

查询位于指定位置的一个元素,大约需要访问()个元素。

A.
B.
C.
D.

第 11 题

插入一个元素到指定位置后面,大约需要访问()个元素。

A.
B.
C.
D.

第 12 题

按以下算法给所有元素排序:

  • 对每个串进行冒泡排序。
  • 个串一起选择排序。

以比较、访问、交换和赋值为基本单位,则大约要运算()次。

提示:

冒泡排序时,交换两个元素,只需将第一个元素删除,再重新插入到第二个元素后面即可。

选择排序时,可以额外维护一个队列,每次选择只需要从每个串的串首元素中进行筛选,选中的元素移入队列,最后将队列中的元素依次插入块状链表(每次插到块状链表末尾)即可。

A.
B.
C.
D.

(五)上机实践(3 小题,6 分)

第 13 题

memset 函数包含在以下()头文件中。

A. algorithm
B. cstring
C. functional
D. iomanip

第 14 题

已知函数 的代码如下,则 )。

int f(int x) { return (x == 1) ? 1 : x * f(x / 2); }

A.
B.
C.
D.

第 15 题

下面是一段错误的代码,在某些情况下会出现运行超时的问题。下列输入中会使程序运行超时的是()。

#include <iostream>
using namespace std;
int main()
{
    int x; // 1 <= x <= 7
    cin >> x;
    int l = 1, r = 7, m;
    while (1)
    {
        m = (l + r) >> 1;
        if (m < x) l = m;
        else if (m > x) r = m;
        else break;
    }
    cout << "Sorry Sleeping Frog, you performed an unsuccessful hacking attempt.";
    return 0;
}

A.
B.
C.
D.

二、阅读程序(共 18 小题,除标注外,判断题 1 分,选择题 3 分,满分 40 分)

(六)蜘蛛算经(6 小题,13 分;第 16 - 18 题为判断题,第 19 - 21 题为选择题,第 21 题 4 分)

#include <iostream>
using namespace std;
int main()
{
    char c;
    int x = 0;
    while (cin >> c)
    {
        x <<= 3;              // Line 9
        int y = c - '0';
        x += y;
    }
    cout << x;
    return 0;
}                             // Line 15

输入格式:

不超过 个数字字符。

第 16 题

将第 行改为 x *= 8,对于任何输入,结果不变,程序可以正常运行。

第 17 题

输入不同,输出就一定不同。

第 18 题

对于某些输入,程序可能会出现整数溢出的问题。

第 19 题

下列判断正确的是()。

A. 输入 000,输出 3
B. 输入 778,输出 1000
C. 输入 123,输出 321
D. 输入 111,输出 73

第 20 题

输入 777,输出()。

A. 255
B. 256
C. 511
D. 512

第 21 题

输入 9,输出最接近()。

A. 亿
B. 亿
C. 亿
D. 亿

(七)左手螺旋(6 小题,13 分;第 22 - 24 题为判断题,第 25 - 27 题为选择题,第 27 题 4 分)

#include <iostream>
using namespace std;
int n, m, x, y;
char way;
bool a[1012][1012];
void report(int ans)
{
    cout << ans;
    exit(0);
}
int dy(char w)
{
    switch (w)
    {
        case 'R': return 1;
        case 'L': return -1;
        default: return 0;
    }
}
int dx(char w)
{
    switch (w)
    {
        case 'U': return -1;
        case 'D': return 1;
        default: return 0;
    }
}
char turn_left(char origin)
{
    switch (origin)
    {
        case 'L': return 'D';
        case 'D': return 'R';
        case 'R': return 'U';
        case 'U': return 'L';
    }
}
int main()
{
    cin >> n >> m;
    cin >> x >> y >> way;
    for (int i = 1; i <= n; i++)
        for (int j = 1; j <= m; j++)
            cin >> a[i][j];
    if (!a[x][y]) report(0);
    int ans = 0;
    while (ans <= 10 * n * m)                      // Line 48
    {
        ans++;
        if (a[x + dx(way)][y + dy(way)] == 1)      // Line 51
        {
            x += dx(way);
            y += dy(way);
            continue;
        }
        way = turn_left(way);
        if (a[x + dx(way)][y + dy(way)] == 1)      // Line 58
        {
             x += dx(way);
             y += dy(way);
             continue;
        }
        report(ans);
    }
    report(-1);                                    // Line 66
    return 0;
}                                                  // Line 68

输入格式:

第一行两个正整数,分别为

第二行两个正整数,分别为

第三行一个字符,保证是 LRUD 之一。

下面一个 列的 01 矩阵。

第 22 题

执行至第 行时,

第 23 题

将第 行和第 行的两个 1 改为 0,则程序对于某些输入将出现数组越界的问题。

第 24 题

若输入的 01 矩阵全为 0,则输出结果一定是 0

第 25 题

输入以下数据:

5 4
4 1
D
1 0 0 1
1 0 0 0
1 0 1 1
1 1 0 1
1 1 0 1

则输出为()。

A. -1
B. 1
C. 4
D. 5

第 26 题

输入 ,01 矩阵全为 1,已知输出为 1,则第三行的字符是()。

A. U
B. D
C. L
D. R

第 27 题

行的 while 循环最多会被执行约()次。

A.
B.
C.
D.

(八)幸福之约(6 小题,14 分;第 28 - 30 题为判断题,第 31 - 33 题为选择题,第 33 题 5 分)

#include <iostream>
using namespace std;
int pr[26];
bool prime(int x)
{
    if (x == 1) return false;                    // Line 6
    for (int i = 2; i * i <= x; i++)
        if (x % i == 0) return false;
    return true; 
}
void set_pr(int v)
{
    int cnt = 0;
    for (int i = 2; i <= v; i++)
        if (prime(i)) cnt++, pr[cnt] = i;
}
int mv = 1, range;
void dfs(int div, int cur, int dep, int num)
{
    if (div > mv) mv = div;
    long long nc = cur;                          // Line 21
    for (int i = 1; i <= num; i++)
    {
        nc *= pr[dep];
        if (nc > range) return;
        dfs(div * (i + 1), nc, dep + 1, i);
    }
}
int main()
{
    set_pr(100);
    cin >> range;
    dfs(1, 1, 1, 30);
    cout << mv;
    return 0;
}                                                // Line 36

输入格式:

一个不超过 的正整数。

第 28 题

删去第 行后,程序对于所有输入仍能正常运行,结果不变。

第 29 题

输入 1,输出 1

第 30 题

将第 行的 long long 改为 int,则程序对某些输入将出现运行超时、空间超限等问题。

第 31 题

程序运行至第 行时,在 中,可能成为 cur 的值有()个。

A.
B.
C.
D.

第 32 题

程序运行过程中,dep 的最大可能值是()。

A.
B.
C.
D.

第 33 题

输入 1000000000),输出()。

A. 30
B. 120
C. 1344
D. 32768

三、补全程序(共 10 小题,每小题 3 分,满分 30 分)

(九)方格计数(5 小题,15 分)

请在程序能运行的前提下尽量优化空间常数。

列的表格中共有多少个格子。

#include <iostream>
#include <string>
using namespace std;
const int X = /* (34)________ */;
const int Y = /* (35)________ */;
const int Z = /* (36)________ */;
int a[X], b[X], c[Y];
string mul(string x, string y)
{
    for (int i = 0, j = x.size() - 1; j >= 0; i++, j--)
        a[i] = x[j] - '0';
    for (int i = 0, j = y.size() - 1; j >= 0; i++, j--)
        b[i] = y[j] - '0';
    for (int i = 0; i <= x.size(); i++)
        for (int j = 0; j <= y.size(); j++)
            c[/* (37)________ */] += (a[i] * b[j]);
    for (int i = 0; i <= Y - 2; i++)
        if (c[i] >= Z) c[/* (38)________ */] += c[i] / Z, c[i] %= Z;
    int h = Y - 1;
    while (c[h] == 0 && h > 0) h--;
    string ans = "";
    for (int i = h; i >= 0; i--)
        ans += (char) (c[i] + '0');
    return ans;
}
int main()
{
    string n, m;
    cin >> n >> m;
    cout << mul(n, m);
    return 0;
}

第 34 题

A. 1000
B. 1 << 10
C. 2000
D. 1 << 11

第 35 题

A. 1000
B. 1 << 10
C. 2000
D. 1 << 11

第 36 题

A. 7
B. 8
C. 9
D. 10

第 37 题

A. i + j
B. i - j
C. i * j
D. i / j

第 38 题

A. i - 1
B. i
C. i + 1
D. i + 2

(十)晚餐时间(5 小题,15 分)

在一座长度为 的独木桥上有 只小猪。

现以独木桥左端为原点,向右为正方向建立数轴。

已知 只小猪的位置分别为

这天晚上,Sleeping Frog 给他们投食了,它们要下桥吃饭。

它们每秒同时按以下规则运动:

  • 数一数它左边和右边各有多少只猪。
  • 向猪更少的那个方向移动。
  • 如果两边猪的数量相等,它不移动。
  • 处于桥两端的猪跳下独木桥。

当然,如果桥上只剩下一只猪时,它就再也不下来了。

求这些猪什么时候全部停止移动(跳下了桥也算停止移动)。

#include <iostream>
using namespace std;
const int N = 1e7 + 12;
int a[N], dis[N];
int l, r, L, R, T, n;
int main()
{
	cin >> n >> T;
	for (int i = 1; i <= n; i++)
		cin >> a[i];
	for (int i = 1; i <= n - 1; i++)
		dis[i] = /* (39)________ */;
	l = 1, r = n, L = a[1], R = T - a[n];
	long long ans = 0;
	while (1)
	{
		int cnt = /* (40)________ */;
		if (cnt <= /* (41)________ */) break;
		int move = min(L, R);
		int mid = /* (42)________ */;
		if (cnt & 1)
		{
			dis[mid - 1] += move;
			dis[mid] += move;
		}
		else dis[mid] += /* (43)________ */;
		L -= move, R -= move, ans += move;
		if (L == 0) L = dis[l], l++;
		if (R == 0) R = dis[r - 1], r--;
	}
	cout << ans;
	return 0;
}

第 39 题

A. a[i + 1] + a[i]
B. a[i] + a[i + 1]
C. a[i + 1] - a[i]
D. a[i] - a[i + 1]

第 40 题

A. l - r
B. r - l
C. l - r + 1
D. r - l + 1

第 41 题

A. 0
B. 1
C. 2
D. 3

第 42 题

A. (l + r) >> 1
B. (l + r) << 1
C. (l + r) + 1
D. (l + r) - 1

第 43 题

A. move >> 1
B. move << 1
C. move + 1
D. move - 1

编辑器加载中 …