第四届小云雀杯普及组初赛
初赛模拟卷 2
一、单项选择(共15题,每题2分,共计30分;每题有且仅有一个正确选项)
- 在计算机中,TB代表的字节数量?()
- A.
- B.
- C.
- D.
- TCP 协议属于哪一层协议( ).
- A. 应用层
- B. 传输层
- C. 网络层
- D. 数据链路层
- 若某二叉树的节点数为 15(根节点深度为1),且这些节点要么为叶子节点要么有 2 个儿子节点,则其最深的叶子深度至多为()
- A. 6
- B. 7
- C. 8
- D. 9
- 以下代码的时间复杂度是()
long long calc(long long n) {
long long res = 0;
for (long long i = 1, j; i * i <= n; i = i + 1) {
j = i * i;
res += j * abs(j - i);
}
return res;
}
- A.
- B.
- C.
- D.
- 以下关于算法空间复杂度的描述,正确的是:
- A. 空间复杂度衡量的是算法运行时临时占用的存储空间大小
- B. 空间复杂度和时间复杂度总是相同的
- C. 递归算法的空间复杂度一定是
- D. 使用越多的变量,空间复杂度就越高
- 已知递归函数定义为:
int S(int n, int k) {
if (n == 0 && k == 0) return 1;
if (n == 0 || k == 0) return 0;
return S(n - 1, k - 1) + k * S(n - 1, k);
}
则 的返回值为()
- A. 10
- B. 15
- C. 25
- D. 31
- 已知十六进制数 AB,其对应的十进制数为()
- A. 171
- B. 186
- C. 172
- D. 202
- A,C为真,B,D为假,需要判断以下哪个逻辑表达式为真
- A. (B∨C)∧(A∨D)
- B. (¬A∨B)∧C
- C. (A∧B)∨(C∧D)
- D. A∧(D∨¬C)∧B
- 以下时间复杂度不是 的排序方法是( ).
- A. 插入排序
- B. 冒泡排序
- C. 选择排序
- D. 归并排序
- 已知一棵二叉树的 中序遍历序列 为
D B E A F C
,后序遍历序列 为D E B F C A
,则它的 前序遍历序列 是( )。
- A
A B D E C F
- B
A B C D E F
- C
A B D F E C
- D
A B D E F C
- 有向图中,点的入度之和是边数的 () 倍
- A. 0.5
- B. 1
- C. 2
- D. 以上答案全错
- 10个人围坐一张圆桌吃饭。这张圆桌的座位是完全相同的(即,旋转后座位布局相同的视为同一种入座方式)。如果其中有2个人不想坐在一起,请问一共有多少种不同的入座方式?
- A. 9!
- B. 9!*8
- C. 8!*7
- D. 8!*9
- 若有变量
int a, float x, y
, 且a=7,x=2.5,y=4.7
, 则表达式x+a%3*(int)(x+y)%2/4
的值保留两位小数的结果是( ).
- A 2.50
- B 2.75
- C 3.50
- D 0.00
- 目前个人电脑的( )市场占有率最靠前的厂商包括 Intel、AMD 等公司。
- A. 显示器
- B. CPU
- C. 内存
- D. 鼠标
- 二叉树的( )第一个访问的节点是根节点。
- A. 先序遍历
- B. 中序遍历
- C. 后序遍历
- D. 以上都是
二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题选正误;除特殊说明外,判断题每题2分,选择题每题3分,共40分)
(一)阅读下列程序,回答问题。
#include <bits/stdc++.h>
using namespace std;
const int N = 1000005;
int n, m, k, s, t, x, a[N];
int find(int x)
{
int l = 1, r = n, mid;
while (l <= r)
{
mid = (l + r) / 2;
if (a[mid] <= x)
r = mid - 1;
else
l = mid + 1;
}
return a[l] == x ? l : -1;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; ++i)
cin >> a[i];
for (int i = 1; i <= m; ++i)
{
cin >> x;
cout << find(x) << ' ';
}
return 0;
}
注意:数据保证,,,
- 判断题
-
程序中find函数对应的算法为二分查找()
-
下列数据对应的输出为
11 8 -1
。 ()
11 3
15 15 13 11 9 7 5 3 3 3 1
1 3 6
- 选择题
- 若给出下列输入时,程序输出的结果为()
5 1
3 1 4 1 5
3
- A. 1
- B. 2
- C. 3
- D. -1
- (4分)下列对于这个程序说法正确的是? ()
- A. 当保证输入的a数组是单调不增时,程序可以对每次输入的x,找到它在a数组中第一次出现的下标
- B. 当保证输入的a数组是单调不减时,程序可以对每次输入的x,找到它在a数组中最后一次出现的下标
- C. 不论a数组是否有序,程序可以对每次输入的x,找到它在a数组中第一次出现的下标
- D. 上述选项都错
(二)阅读下列程序,回答问题。
#include <iostream>
using namespace std;
#define MAXN 41
int pf[MAXN][MAXN];
int f(int n, int m) {
if (n <= 1 || m < 3)
return 1;
if (pf[n][m] != -1)
return pf[n][m];
int ans = 0;
for (int i = 0; i < m; i += 3)
ans += f(n - 1, i);
pf[n][m] = ans;
return ans;
}
int main() {
int n, m;
cin >> n >> m;
for (int i = 0; i < MAXN; i++)
for (int j = 0; j < MAXN; j++)
pf[i][j] = -1;
cout << f(n, m);
return 0;
}
注意:输入的
- 判断题
- f(n,m)函数中,m永远不可能是奇数。()
- 将 改成 ,存在n变化前后
f(n,m)
答案不变的(n,m)
() - 将8,9,13行去除后,答案可能会改变()
- 输入
2 5
得到的答案为 3。 ()
- 选择题
- 选出下列输入中执行结果和其他不同的一项()
A.
2 5
B.
2 6
C.
2 4
D.
2 3
- (4分)输入后输出2的合法输入有多少种? ()
A. 3
B. 39
C. 117
D. 40
(三)阅读下列程序,回答问题。
#include <bits/stdc++.h>
int n, r, num[10000];
bool mark[10000];
void print()
{
for (int i = 1; i <= r; i++)
printf("%d ", num[i]);
printf("\n");
}
void search(int x)
{
for (int i = 1; i <= n; i++)
if (!mark[i])
{
num[x] = i;
mark[i] = true;
if (x == r)
print();
search(x + 1);
mark[i] = false;
}
}
int main()
{
scanf("%d%d", &n, &r);
search(1);
return 0;
}
- 判断题
-
若
n < r
,则程序无输出() -
程序结束时,对任意 ,
mark[i] == 0
。() -
此程序的时间复杂度为 ()
- 选择题
- (4分)若输入为
6 3
,则函数print
的执行次数为?
A. 60
B. 120
C. 6
D. 720
- (4分)若输入为
7 4
,则输出的最后一行为()
A. 1 2 3 4
B. 4 5 6 7
C. 4 3 2 1
D. 7 6 5 4
三、完善程序(单选题,每小题3分,共计30分)
(一)完善程序第一题
题目描述
在一个 n × m 的矩形网格图A中,每个格子都有一个整数值。需要找到满足以下条件的格子对 (a,b) 和 (c,d):格子中的整数 A[a][b] 和 A[c][d] 相等,且它们的位置满足 ∣a−c∣=∣b−d∣>0。要求计算出满足这些条件的格子对的总数,特别的,格子对 ((a, b), (c, d) 和 ((c, d), (a, b)) 视为两个不同的对。 1 <= n, m <= 1000 1 <= A[i][k] <= 1000
#include <bits/stdc++.h>
using namespace std;
int a[1005][1005];
int n, m, ans;
int f(int x, int y)
{
int p = ___31___;
int xx = x, yy = y;
int sum = 0;
while (xx < n && yy > 1)
{
____32____
if (a[xx][yy] == p)
sum += 2;
}
____33____
while (____34____)
{
xx++;yy++;
if (a[xx][yy] == p)
____35____;
}
return sum;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
cin >> a[i][j];
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++)
ans += f(i, j);
cout << ans;
return 0;
}
选择题(每个空有A、B、C、D四个选项)
- 31处应填入()
- A.
a[i][j]
- B.
a[x][y]
- C.
a[xx][yy]
- D.
f[xx][yy]
- 32处应填入()
- A.
x--; y++;
- B.
x++; y++;
- C.
x--; y--;
- D.
x++; y--;
- 33处应填入()
- A.
xx = x;
- B.
xx = x; yy = y;
- C.
xx = 0; yy = 0;
- D.
xx = 1; yy = 1;
- 34处应填入()
- A.
xx < n && yy > 1
- B.
xx < n || yy > 1
- C.
xx < n && yy < m
- D.
xx < n || yy < m
- 35处应填入()
- A.
sum += 1
- B.
sum += 2
- C.
sum += a[xx][yy]
- D.
sum += p
(二)
题目描述
实现一个中缀表达式求值程序,支持以下运算:
- 四种基本运算符:加 +、减 -、乘 *、除 /;
- 支持括号嵌套:( 和 );
- 所有操作数为 0~9 的数字,即参与运算的数字为 0 ~ 9;
- 不考虑负号作为负数标志; 输出最终计算结果。
保证运算过程中所有数均在 long long 范围内。
#include <bits/stdc++.h>
using namespace std;
string s;
stack <char> s1;
stack <long long> s2;
void pop_()
{
char c = ___36____;
s1.pop();
long long num1 = s2.top();
s2.pop();
long long num2 = s2.top();
s2.pop();
long long res = 0;
if (c == '+') res = num1 + num2;
else if (c == '-') ____37_____;
else if (c == '*') res = num1 * num2;
else res = num2 / num1;
s2.push(res);
}
int main()
{
cin >> s;
for (int i = 0; i < s.length(); i++)
{
if (s[i] == '(') s1.push('(');
else if (s[i] == ')')
{
while (_____38______)
pop_();
s1.pop();
}
else if (s[i] <= '9' && s[i] >= '0')
s2.push(s[i] - '0');
else
{
if (s[i] == '+' || s[i] == '-')
{
while (!s1.empty() && s1.top() != '(')
pop_();
}
else
{
while (!s1.empty() && (____39_____))
pop_();
}
s1.push(s[i]);
}
}
while (!s1.empty())
____40_____;
cout << s2.top();
return 0;
}
-
36处应填入()
A.s1.top()
B.s2.top()
C.s[0]
D.s[1]
-
37处应填入()
A.res = num2 - num1
B.res = num1 - num2
C.res -= num2
D.res -= num1
-
38处应填入()
A.s1.top() != '('
B.s1.top() != ')'
C.s2.top() != '('
D.s2.top() != ')'
-
39处应填入()
A.s1.top() == '+' || s1.top() == '-')
B.s1.top() == '+' && s1.top() == '-')
C.s1.top() == '*' || s1.top() == '/')
D.s1.top() == '*' && s1.top() == '/')
-
40处应填入()
A.s1.pop()
B.s2.pop()
C.pop_()
D.s2.top() = pop_()
我们会在赛后检查代码相似度。
- 状态
- 正在进行…
- 规则
- ACM/ICPC
- 题目
- 1
- 开始于
- 2025-9-15 14:45
- 结束于
- 2025-12-7 22:45
- 持续时间
- 2000 小时
- 主持人
- 参赛人数
- 26