CSP-J 练习C卷

*
基本信息:
班级名称填写要求,如"801"、“808”、“701”
姓名:
姓名:
班级:
班级:
*
1、将二进制数 10101011 与 00110010 进行按位与操作,得到的结果是( )。
A. 10101011
B. 00110010
C. 00100010
D. 10100011
*
2、浏览网页时,有些网址以 http://开头,另一些则以 https://开头。这里的 h 指的是( )的缩写。
A. Highspeed
B. High
C. Hyperspeed
D. Hyper
*
3、下列网络设备中,主要用作连接不同局域网的是( )。
A. 路由器
B. 集线器
C. 网卡
D. 中继器
*
4、将四个数字-1,-2,2,3 经过四则运算(即只使用加、减、乘、除和括号)后,可能得到的最大结果是( )。
A . 12
B. 16
C. 8
D. 20
*
5、下述排序方法中在任何情况下时间复杂度都是 O(nlogn)的是( ) 。
A. 插入排序
B. 选择排序
C. 快速排序
D. 归并排序
*
6、计算机病毒是可以造成电脑故障的一种( )。
A. 计算机设备
B. 计算机芯片
C.计算机部件
D. 计算机程序
*
7、对于拓扑排序,若要求所有节点都入队一次,以下描述正确的是( )。
A. 拓扑排序中入度为 0 的结点总会排在入度大于 0 的结点的前面。
B. 考虑一个有向无环图,如果在图中存在从节点 u 到节点 v 的有向边,那么在拓扑排序后的拓扑序中 u 一定在 v 的前面。
C. 拓扑排序可以用于有环图。
D. 拓扑排序的结果是唯一的,不受图的表示方式的影响。
*
8、下列结构中为非线性结构的是( )。
A. 树
B. 数组
C. 链表
D. 高维矩阵
*
9、逻辑变量 A=true,B=false,C=true,D=false,以下逻辑运算表达式的值为真的有( )。
A.(B∨C∨D)∧D
B. ((- A∧B)∨C)∧-B
C.(A∧B)∨(C∧D∨-A)
D. A∧(D∨-C)∧B
*
10、一位魔术师要将名为雪球、芝麻和星宝的三只兔子藏进 A,B,C,D 四个帽子里。每个帽子最多放置两只兔子,那么一共有多少种不同的藏法( )。
A. 64
B. 81
C. 48
D. 60
*
11、在一个单链表中,O(n)时间复杂度的操作是( )。
A. 在链表头部插入一个新节点
B. 在链表尾部插入一个新节点
C. 删除链表中的一个节点,已知该节点的指针。
D. 查找链表中的最大值节点
*
12、若 3 个顶点的无权图 G 的邻接矩阵用数组存储为{ {0,1,1} , {1,0,1} , {0,1,0} },假定在具体存储中顶点依次为:1, 2, 3。关于该图,下面说法错误的是( )。
A. 该图是有向图
B. 该图是强连通的
C. 该图所有顶点的入度之和减所有顶点的出度之和等于 1
D. 从 1 号点开始的深度优先遍历所经过的顶点序列与广度优先遍历经过的顶点序列是相同的(优先级相同时字典序小的顶点优先遍历)
*
13、一位老师想用 40 米的栅栏靠着一面墙围出一个四边形。已知墙的长度足够长,问这个四边形的面积最大可能是( )平方米。
A. 180
B. 225
C. 1600/9
D. 200
*
14、IPv4 中,以下 IP 地址不合法的是( )
A. 255.255.255.255
B. 10.20.30.40
C. 0.10.20.30
D.1.0.0.0
*
15、下面哪位科学家被世人尊称为人工智能之父。( )
A. 冯若依曼
B. 理查德·斯托曼
C. 香农
D. 图灵
*
二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填√,
错误填×;除特殊说明外,判断题 1.5 分,选择题 3 分,共计 40 分)(1)
01 #include <bits/stdc++.h>
02 using namespace std;
03 priority_queue<int, vector<int>, greater<int> > que;
04 int main()
05 {
06 int n, ans, val = 0;
07 cin >> n;
08 for (int i = 1; i <= n; i++) {
09 cin >> val;
10 que.push(val);
11 }
12 while (que.size() > 1) {
13 int x = que.top();
14 que.pop();
15 int y = que.top();
16 que.pop();
17 ans += x + y;
18 que.push(x + y);
19 }
20 cout << ans << endl;
21 return 0;
22 }
假设输入的 n、val 均是不超过 50000 的自然数,完成下面的判断题:
 判断题
16. 第 3 行 priority_queue 替换成 queue,不会影响程序运行效率。( )
*
17. 本程序有缺陷,当输入的 n 和 val 都过大时,结果有可能溢出。( )
*
18. 程序最后输出的结果一定比输入的任何数都要大。(
*
19. 当输入为“3 3 4 5”时,输出为“20”。( )
*
20. 该算法总的时间复杂度为 O(nlogn)。( )
*
21. 当输入为“10 12 36 26 41 36 70 31 16 90 43”时,输出为( )
A.“160”
B.“90”
C. “1262”
D. “22”
*
(2)
01 #include <iostream>
02 #include <vector>
03 using namespace std;
04 const int INF = (int)1e9;
05 vector<vector<int>> zdl(const vector<vector<int>> &graph, int n) {
06 vector<vector<int>> dist(graph);
07 for (int k=1; k<=n; k++) {
08 for (int i=1; i<=n; i++) {
09 for (int j=1; j<=n; j++) {
10 if(dist[i][k]!=INF&&dist[k][j]!=INF&&dist[i][k]+dist[k][j]<dist[i][j]){
11 dist[i][j] = dist[i][k] + dist[k][j];
12 }
13 }
14 }
15 }
16 return dist;
17 }
18 int main() {
19 int n, m, x;
20 cin>>n>>m>>x;
21 vector<vector<int>> graph(n+1,vector<int>(n+1,INF));
22 for (int i=1; i<=n; i++) graph[i][i]=0;
23 for (int i=0; i<m; i++) {
24 int u, v, w;
25 cin>>u>>v>>w;
26 graph[u][v]=w;
27 }
28 vector<vector<int>> dist=zdl(graph, n);
29 for (int i=1; i<=n; i++) {
30 int round_trip_time=dist[i][x]+dist[x][i];
31 if (round_trip_time>=INF) cout<<"impossible"<<endl;
32 else cout<<round_trip_time<<endl;
33 }
34 return 0;
35 }
假设输入的 n、m、w 都是不超过 10000 的自然数,完成下面的判断题和选
择题:
 判断题
22. 第 5~17 行计算最短路径使用的是 Floyd 算法。(
*
23. 第 21~27 行构建的图是有向图。( )
A、正确
B、错误
*
24. 该程序返回的是图中各顶点到 x 点的最短距离。( )
A、正确
B、错误
*
25. 该算法的时间复杂度是( )。
A、O(n^3)
B、O(n^2)
C、O(nm)
D、O(uv)
*
26. 当输入为“3 3 1 1 2 2 2 3 1 3 1 3”时,输出分别为( )。
A、“3 0 6”
B、“3 3 0”
C、“0 6 6”
D、“3 3 6”
*
27. 当输入为“5 5 5 1 5 7 2 5 4 3 4 4 4 5 6 5 4 10”时,输出分别为( )。
A、“0”、“16”、“10”、“6”、“7”
B、“10”、“22”、“impossible”、“6”、“7”
C、“impossible”、“impossible”、“impossible”、“impossible”和“0”
D、“impossible”、“impossible”、“impossible”、16 和“0”
*
(3)
01 #include <iostream>
02 #include <vector>
03 #include <queue>
04 using namespace std;
05 typedef pair<int, int> pii;
06 int mst(const vector<vector<pii>>& graph) {
07 int n=graph.size();
08 vector<bool> visited(n, false);
09 vector<int> distances(n, (int)1e9 );
10 priority_queue<pii, vector<pii>, greater<pii>> pq;
11 distances[0]=0;
12 pq.push({0, 0});
13 while (!pq.empty()) {
14 int u = pq.top().second;
15 pq.pop();
16 if (visited[u]) continue;
17 visited[u] = true;
18 for (const auto& neighbor : graph[u]) {
19 int v = neighbor.first, weight = neighbor.second;
20 if (!visited[v] && distances[v] > weight) {
21 distances[v] = weight;
22 pq.push({distances[v], v});
23 }
24 }
25 }
26 int totalWeight = 0;
27 for (int i=0; i<n; ++i) totalWeight+=distances[i];
28 return totalWeight;
29 }
30 int main() {
31 int n, m;
32 cin >> n >> m;
33 vector<int> colors(n);
34 for (int i=0; i<n; ++i) cin>>colors[i];
35 vector<vector<pii>> graph(n);
36 for (int i=0; i<m; ++i) {
37 int u, v;
38 cin >> u >> v;
39 u--; v--;
40 int weight = (colors[u] == colors[v]) ? 1 : 0;
41 graph[u].push_back({v, weight});
42 graph[v].push_back({u, weight});
43 }
44 int ans = mst(graph);
45 cout << ans << endl;
46 return 0;
47 }
假设输入的 n,m 是不超过 1000 的自然数,完成下面的判断题和选择题:
 判断题
28. 程序中使用的是 kruskal 算法。(
*
29.输入的 n 表示图的顶点数,m 表示边数。( )
A. 正确
B. 错误
*
30 :当 visited[u]==true 时,表示 u 这个点已经访问过了。( )
A. 正确
B. 错误
*
31:ans 表示保持所有点连通,连接所有同色顶点的最少边数。( )
A. 正确
B. 错误
*
32:使用 priority_queue 的目的在于加速查找( )
A. 与已选边相连的边中权值最小的
B. 所有边中权值最小的
C. 任意两点间的最短路径
D. 同色点间的最短路径
*
33:由程序可知同色顶点间边的权值为 1,异色顶点间边的权值为 0,这是为了( )
A. 同色点间的边优先选择
B. 异色点间的边优先选择
C. 同色和异色点间的边交替选择
D. 只选择同色点间的边
*
34: 当输入为
4 4
1 1 2 2
1 2
2 3
3 4
4 1
,输出是( )
A. 4
B. 3
C. 1
D.2
*
三、完善程序(单选题,每小题 3 分,共计 30 分)
(1)(进制转换)现给出两个转换后的 3 位数,请你算出原数转换时分别使
用的进制。
试补全枚举程序。
01 #include<bits/stdc++.h>
02 using namespace std;
03 int a1,a2,a3,s,b1,b2,b3,n,x,y,l,r,to,mid,ans;
04 int er(int one,int two,int an)
05 {
06 l=10; r=15000;
07 while (l+1<r)
08 {
09 mid=(l+r)/2;
10 to=mid*one+mid*mid*two;
11 if (to<an) l=mid;
12 else if ( ① ) return mid;
13 else r=mid;
14 }
15 if (l*one+l*l*two==an) return l;
16 if ( ② ) return r;
17 if ( ③ ) return l+1;
18 return 0;
19 }
20 int main()
21 {
22 scanf("%d %d",&x,&y);
23 a1=x%10; a2=x/10%10; a3=x/100;
24 b1=y%10; b2=y/10%10; b3=y/100;
25 for (int i=10; i<=15000; i++)
26 {
27 s=a3*i*i + a2*i + ④;
28 ans = er( ⑤ );
29 if (ans) { printf("%d %d\n",i,ans), return; }
30 }
31 return 0;
32 }
35. ① 处应填(
A. to>=an
B. to!=a
C. to==an
D. to<=an
*
36. ② 处应填( )
A. (r 1)*one+ (r 1)*(r 1)*two==an
B. r*r*one+ r*two==an
C. r*one +r*r*two>=an
D. r*one+ r*r*two==an
*
37: ③ 处应填( )
A. l*one+ l*l*two==an
B. (l+ 1)*one +(l+ 1)*(l +1)*two==an
C. (l +1)*(l +1)*one+ (l +1)*two==an
D. l*one +(l+ 1)*(l +1)*two==an
*
38: ④ 处应填( )
A. a1
B. a1-b1
C. b1
D. a1 +b1
*
39. ⑤ 处应填( )
A. b2,b3,s
B. a2,a3,s
C. a1,b1,s
D. a2,b2,s
*
(2)(教室安排)有两门课可选,每人只能选一门。N 名同学排成一排,老师只
会把连续一段的同学分进同一间教室,教室里选两门课的人数相差不超过 M。求
至少需要多少间教室。
试补全程序。
01 #include<cstdio>
02 #include<cstring>
03 #include<algorithm>
04 using namespace std;
05 int n,k,m,a[10010],l[10010],r[10010],f[10010];
06 int main()
07 {
08 scanf("%d%d",&n,&m);
09 for (int i=1; i<=n; i++) scanf("%d",&a[i]);
10 for (int i=1; i<=n; i++)
11 if (a[i]==1) l[i]=l[i-1]+1, ①;
12 else ②, r[i]=r[i-1]+1;
13 memset(f,127,sizeof(f));
14 f[0]=0;
15 for (int i=1; i<=n; i++)
16 for (int j=1; j<=i; j++)
17 if (abs( (l[i] - l[j-1]) - ( ③ ) ) <= m || ④ || r[i]==r[j-1])
18 f[i] = min( ⑤ );
19 printf("%d\n", f[n]);
20 return 0;
21 }
40. ① 处应填(
A. r[i]=r[i-1]+1
B. r[i]=r[i]+1
C. r[i]=r[i]-1
D. r[i]=r[i-1]
*
41. ② 处应填( )
A、l[i]=l[i-1]
B、l[i]=l[i-1] 1
C、l[i]=l[i-1]-1
D、l[i]=l[i] 1
*
42. ③ 处应填(
A、r[i] - r[j]
B、r[i] + r[j-1]
C、r[i] - r[j-1]
D、r[i] + r[j]
*
43. ④ 处应填( )
A、l[i]==l[i]+ 1
B、l[i]==l[i-1]
C、l[i]==l[j-1]
D、l[i]==l[j]
*
44. ⑤ 处应填( )
A、f[i], f[i-1] +1
B、f[i], f[j-1]
C、f[i], f[j-1] +1
D、f[i], f[i-1]
问卷星提供技术支持
举报