1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | |
答案 | C | D | B | A | B | C | C | B | C | D | A | A | B | D | C |
第 1 题 下列代码中 ,⽤到的算法是什么算法 ,去掉存储的空间 ,算法本⾝⽤到的空间复杂度是多少 ()
A. 二分法 , O(log2N)
B. 二分法 , O(N)
C. 折半查找 , O(1)
D. 折半查找 , O(N log2N)
第 2 题 ⽆向图的临接矩阵存储⽅法中 ,下列描述正确的是( )。
A. 对角矩阵
B. 稀疏矩阵
C. 非对称矩阵
D. 对称矩阵
第 3 题 下列代码依次输⼊10,3,2后 ,结果是( )。
来源:6547网 http://www.6547.cn/doc/msitz6u6rp
A. 23
B. 120
C. 16
D. 155
第 4 题 ⼀个等边五边形 ,每个顶点上有⼀个蚂蚁 ,蚂蚁沿着五边形的边严格匀速⾏⾛ ,⽅向随机 ,请问 ,开始⾛以 后 ,蚂蚁两两不相碰的概率是多少( )。
A. 1/16
B. 1/4
C. 1/32
D. 1/8
第 5 题 ⼀根长度为1的⼩⽊棒 ,随机的折成三段 ,请问这三段能够组成⼀个三角形的概率是多少? ( )。
A. 1/3
B. 1/4
C. 1/8
D. 1/2
第 6 题 有北京 ,雄安 ,天津三个城市, 同样两个城市之间来回票价⼀样 。请问⽕车售票部门需要准备⼏种车票 ,⼏ 种票价( )。
A. 3,3
B. 6,6
C. 6,3
D. 3,6
第 7 题 对于如下图的⽆向图 ,在⽤Prim算法以节点F作为起点⽣成最⼩树的过程中 ,哪个选项不是产⽣最⼩树的中 间状态? ( )。
A.
B.
C.
D.
第 8 题 对于⼀棵是完全⼆叉树的排序⼆叉树 ,其平均搜索的时间复杂度为() 。
口 A. 0 )
0 B. 0(log n)
0 C. 0()
口 D. 0(n2)
第 9 题 关于快速幂 ,下列说法错误的是( )。
A. 使⽤了倍增思想
口 B. 每⼀步都把指数分成两半 ,⽽相应的底数做平⽅运算
C. 时间复杂度为 。(NlogN)
0 D. 可以⽤快速幂⽅法计算斐波那契数列的第 N 项
第 10 题 下⾯实现杨辉三角形的程序中 ,横线处填写正确的是( )。
0 A. z = triangles(x, y-1) + triangles(x, y)
0 B. z = triangles(x-1, y+1) + triangles(x-1, y-1)
0 C. z = triangles(x-1, y-1) + triangles(x, y)
0 D. z = triangles(x-1, y-1) + triangles(x-1, y)
第 11 题 设有编号为1 ,2 ,3 ,4 ,5的五个球和编号为1 ,2 ,3 ,4 ,5的盒⼦ ,现将这5个球投⼊5个盒⼦要求每个盒 ⼦放⼀个球 ,并且恰好有两个球的号码与盒⼦号码相同, 问有多少种不同的⽅法( )。
A. 20
B. 10
C. 12
D. 24
第 12 题 1名⽼师和4名获奖同学排成⼀排照相留念 ,⽼师不站两端的排法下列所列式⼦正确的是() 。
口 A. C31A44
B. A31A44
0 C. C31C44
0 D. A31C44
第 13 题 关于赋权图中 ,从某⼀个点出发 ,寻找最短路径的算法Dijkstra ,下列说法中错误的是( )。
A. 算法解决了赋权有向图或者⽆向图的单源最短路径问题
B. 算法最终得到⼀个最短路径树
C. 常⽤于路由算法或者作为其他图算法的⼀个⼦模块
D. 算法采⽤的是⼀种贪⼼的策略
第 14 题 关于图的存储⽅法中 ,下列说法错误的是( )。
A. 图的存储结构主要分为:邻接矩阵和邻接表
B. 图的邻接矩阵存储⽅式是⽤两个数组来表⽰图:⼀个⼀维数组存储图中顶点信息 ,⼀个⼆维数组(邻接矩 阵)存储图中的边或弧的信息。
C. 对于边数相对顶点较少的图 ,邻接矩阵结构存在对存储空间的极⼤浪费
D. 如果图中边的数⽬远远⼤于n的平⽅称作稀疏图 ,这是⽤邻接表表⽰⽐⽤邻接矩阵表⽰节省空间
第 15 题 Dijkstra算法中 ,定义S集合是已求出最短路径的节点集合 ,对于下图中的图 ,Dijkstra算法的中间形成的S集 合 ,错误的是( )。
A. S={0(3)}
B. S={0(3),2(6)}
C. S={0(3),2(6),1(5)}
D. S={0(3),2(6),1(8)}
2 2 20
1 2 3 4 5 6 7 8 9 10 |
答案 |
第 1 题 线性表可以是空表 ,树可以是空树, 图也可以是空。
第 2 题 在具有 个顶点、 条边的⽆向图中, ⽆向图的全部顶点的度的和等于边数的 2 倍。
第 3 题 图的任意⼏个点 ,⼏个边都可以组成这个图的⼦图。
第 4 题 在具有 个顶点、 条边的有向图中 ,⼊度+出度的和是 。
第 5 题 当⼀棵排序⼆叉树退化为单⽀⼆叉树后 ,其平均⽐较次数是 。
第 6 题 不算数据的存储 ,插⼊排序算法的空间复杂度为 。
第 7 题 图的存储⽅式主要有两种:邻接表和邻接矩阵。
第 8 题 对于边数相对顶点较少的图 ,使⽤邻接矩阵来存储更好。
第 9 题 排列问题与顺序有关 ,组合问题与顺序⽆关。
第 10 题 ⽤分治法可以优化等⽐数列的前 项求和的算法。
3 编程题 (每题 25 分 ,共 50 分)
3.1 编程题 1
试题名称:公倍数问题
3.1.1 问题描述
⼩ A 写了⼀个 N X M 的矩阵 A ,我们看不到这个矩阵 ,但我们可以知道 ,其中第 i ⾏第j列的元素 Ai,j 是 i 和 j 的 公倍数( ,) 。现在有 K 个⼩朋友 ,其中第 K 个⼩朋友想知道 ,矩阵 A 中最多有多少个元 素可以是 k( ) 。请你帮助这些⼩朋友求解。
注意:每位⼩朋友的答案互不相关 ,例如 ,有些位置既可能是 ,⼜可能是 ,则它同可以时满⾜ 两名⼩朋友的 要求。
⽅便起见 ,你只需要输出Kk=1 k × ansk 即可 ,其中 ansk 表⽰第 k 名⼩朋友感兴趣的答案。
3.1.2 输入描述
第⼀⾏三个正整数N,M, K。
3.1.3 输出描述
输出⼀⾏, 即 Kk=1 k × ansk 。
请注意 ,这个数可能很⼤ ,使⽤ C++语⾔的选⼿请酌情使⽤ long long 等数据类型存储答案。
3.1.4 特别提醒
在常规程序中 ,输⼊ 、输出时提供提⽰是好习惯 。但在本场考试中, 由于系统限定 ,请不要在输⼊ 、输出中附带任 何提⽰信息。
3.1.5 样例输入 1
3.1.6 样例输出 1
3.1.7 样例解释 1
只有 A1 , 1 可以是 1 ,其余都不⾏。
A1,1 A12 A2 1 A2,2 都可以是 2 ,⽽其余不⾏。
因此答案是 1 × 1 2 × 4 = 9。
3.1.8 样例输入 2
3.1.9 样例输出 2
3.1.10 数据规模
对于 30 的测试点 ,保证 N, M, K 10;
对于 60 的测试点 ,保证 N, M, K ≤ 500;
对于 100 的测试点 ,保证 N, M ≤ 105 ,K
3.1.11 参考程序
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | def count_divisors(limit, num): s = [0] * (num + 1) for i in range(1, limit + 1): for j in range(i, num + 1, i): s[j] += 1 return s def main(): N, M, K = map(int, input().split()) s_N = count_divisors(N, 10 ** 6) s_M = count_divisors(M, 10 ** 6) result = 0 for k in range(1, K + 1): result += k * s_N[k] * s_M[k] print(result) if __name__ == "__main__": main() |
3.2 编程题 2
试题名称:接⽵竿
3.2.1 题面描述
⼩杨同学想⽤卡牌玩⼀种叫做“接⽵竿” 的游戏。
游戏规则是:每张牌上有⼀个点数 ,将给定的牌依次放⼊⼀列牌的末端 。若放⼊之前这列牌中已有与这张牌点数相 同的牌 ,则⼩杨同学会将这张牌和点数相同的牌之间的所有牌全部取出队列(包括这两张牌本⾝) 。
⼩杨同学现在有⼀个长度为 的卡牌序列 A ,其中每张牌的点数为 Ai( ) 。⼩杨同学有 q 次询问 。第 次 ( ) 询问时 ,⼩杨同学会给出 i,Ti ,⼩杨同学想知道如果⽤下标在 [li Ti的所有卡牌按照下标顺序玩“接⽵ 竿” 的游戏 ,最后队列中剩余的牌数。
3.2.2 输入格式
第一行包含一个正整数 T ,表示测试数据组数。
对于每组测试数据 ,第一行包含一个正整数 n ,表示卡牌序列 A 的长度。
第二行包含 个正整数 A1 A2, ,An ,表示卡牌的点数 A。
第三行包含一个正整数 q ,表示询问次数。
接下来 q 行 ,每行两个正整数 i Ti ,表示一组询问。
3.2.3 输出格式
对于每组数据 ,输出 q 行 。第 i 行( )输出一个非负整数 ,表示第 i 次询问的答案。
3.2.4 样例 1
1 2 3 4 5 6 7 8 | 1 6 1 2 2 3 1 3 4 1 3 1 6 1 5 5 6 |
1 2 3 4 | 1 1 0 2 |
3.2.5 样例解释
对于第一次询问 ,小杨同学会按照 1 , 2 2 的顺序放置卡牌 ,在放置最后一张卡牌时 ,两张点数为 2 的卡牌会被收 走, 因此最后队列中只剩余一张点数为 的卡牌。
对于第二次询问, 队列变化情况为:
{} → {1} → {1 , 2} → {1 , 2 , 2} → {1} → {1 , 3} → {1 , 3, 1} → {} → {3} 。 因此最后队列中只剩余一张点数为 3 的卡 牌。
3.2.6 数据范围
子任务编号 数据点占比 T n q max Ai 特殊条件 | |||||
1 30 ≤ | 5 ≤ | ≤ | 100 ≤ 13 | ||
2 30 ≤ | 5 ≤ 1 | 5 × 104 ≤ 1 | 5 × 104 ≤ 13 | 所有询问的右端点等于n | |
3 40 ≤ | 5 ≤ 1 | 5 × 104 ≤ 1 | 5 × 104 ≤ 13 |
对于全部数据 ,保证有 1 ≤ T ≤ 5 ,1 ≤ n 1 . 5 × 104 , , 。
3.2.7 参考程序
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
n = int(input())
m = int(math.log(n, 2)) + 1
A = list(map(int, input().split()))
pos = {}
nxt = [[n for i in range(m + 1)] for j in range(n)]
for i in range(n - 1, -1, -1):
if not (A[i] in pos):
nxt[i][0] = n
else:
nxt[i][0] = pos[A[i]]
pos[A[i]] = i
for i in range(n - 1, -1, -1):
for j in range(1, m + 1):
if nxt[i][j - 1] + 1 < n:
nxt[i][j] = nxt[nxt[i][j - 1] + 1][j - 1]
Q = int(input())
for q in range(Q):
l, r = map(int, input().split())
l, r = l - 1, r - 1
x, ans = l, 0
while x <= r:
while x <= r and nxt[x][0] > r:
x, ans = x + 1, ans + 1
if x > r:
break
for i in range(m, -1, -1):
if nxt[x][i] <= r:
x = nxt[x][i]
break
x += 1
print(ans)