1033 - CSP 2020 第一轮(初赛)模拟
题目数量20
测试时间2 小时
题目列表
第 1 题第 2 题第 3 题第 4 题第 5 题第 6 题第 7 题第 8 题第 9 题第 10 题第 11 题第 12 题第 13 题第 14 题第 15 题第 16 题第 17 题第 18 题第 19 题第 20 题
第 1 题
十进制数 114114 的相反数的 88 位二进制补码是:
- A.
10001110
B.10001101
C.01110010
D.01110011
本题共 2 分第 2 题
以下哪个网站不是 Online Judge(在线程序判题系统)?Online Judge 可以查看算法题目,提交自己编写的程序,然后可以获得评测机反馈的结果。
- A.
Luogu
B.Gitee
C.LeetCode
D.Codeforces
本题共 2 分第 3 题
小 A 用字母 AA 表示 11,BB 表示 22,以此类推,用 2626 表示 ZZ。对于 2727 以上的数字,可以用两位或者更长的字符串来对应,例如 AAAA 对应 2727,ABAB 对应 2828,AZAZ 对应 5252,AAAAAA 对应 703703……那么 BYTBYT 字符串对应的数字是什么?
- A.
2018
B.2020
C.2022
D.2024
本题共 2 分第 4 题
UIM 拍摄了一张照片,其分辨率是 4096×21604096×2160,每一个像素都是 2424 位真彩色。在没有压缩的情况下,这张图片占用空间接近以下哪个值?
- A.
8MB
B.25MB
C.200MB
D.200KB
本题共 2 分第 5 题
在一个长度为 nn 的数组中找到第 kk 大的数字,平均的算法时间复杂度最低的是:
- A.
O(n)O(n)
B.O(nk)O(nk)
C.O(nlogn)O(nlogn)
D.O(n2)O(n2)
本题共 2 分第 6 题
对于“树”这种数据结构,正确的有:
①一个有 nn 个顶点、n−1n−1 条边的图是树
②一个树中的两个顶点之间有且只有一条简单路径
③树中一定存在度数不大于 11 的顶点
④树可能存在环
- A.
①②④
B.①②③
C.②③
D.①②
本题共 2 分第 7 题
博艾中学进行了一次信息学会考测试,其优、良、及格、不及格的试卷数量分别为 10,13,14,510,13,14,5 张。现在这些卷子混在一起,要将这些卷子按照等级分为 44 叠。分卷子的方法是,每次将一叠有不同等级答卷的卷子分为两堆,使得这两堆中没有相同等级的卷子,然后可以再分,直到分为 44 叠。要分完这些卷子,至少需要多少次“分卷子”的操作?将一堆数量为 nn 的卷子分成两堆,就会产生 nn 次分卷子的操作。
- A.
84
B.93
C.78
D.85
本题共 2 分第 8 题
一个二叉树的前序遍历是 HGBDAFECHGBDAFEC,中序遍历是 BGHFAEDCBGHFAEDC,同时采用顺序存储结构,即用一维数组元素存储该二叉树中的结点(根结点的下标为 11,若某结点的下标为 ii,则其左孩子位于下标 2i2i 处、右孩子位于下标 2i+12i+1 处),则该数组的最大下标至少为( )
- A.
7
B.13
C.15
D.12
本题共 2 分第 9 题
在 C++ 语言中,如果 a=1;b=0;c=1;
那么以下表达式中为 11 的是:
- A.
B.a&&b||b&&c
C.a+b>c||b
D.!(!c&&(!a||b))
a+b+c
本题共 2 分第 10 题
在一个初始长度为 nn 的链表中连续进行 kk 次操作,每次操作是读入两个数字 aiai 和 bibi,在链表中找到元素为 aiai 的结点(假设一定可以找到),然后将 bibi 这个元素插入到这个结点前面。在最理想的情况下,链表访问的结点数量最少可能是多少(不算将要插入的结点)?
- A.
nn 次
B.kk 次
C.nknk 次
D.n+kn+k 次
本题共 2 分第 11 题
A 班有 55 名风纪委员,B 班有 44 名风纪委员,C 班有 33 名风纪委员。现在需要这些同学中选取 66 名风纪委员巡逻,如果只关注各班派出的风纪委员人数,有几种不同的方案?
- A.
9
B.12
C.15
D.18
本题共 2 分第 12 题
以下哪种排序算法的时间复杂度是 O(n2)O(n2)?
- A.
计数排序
B.插入排序
C.希尔排序
D.归并排序
本题共 2 分第 13 题
已知 rand()
可以生成一个 00 到 3276732767 的随机整数,如果希望得到一个范围在 [a,b)[a,b) 的随机整数,aa 和 bb 均是不超过 100100 的正整数且 a<ba<b,那么可行的表达式是什么?
- A.
B.(rand()%(b-a))+a
C.(rand()%(b-a+1))+a
D.(rand()%(b-a))+a+1
(rand()%(b-a+1))+a+1
本题共 2 分第 14 题
一个 77 个顶点的完全图需要至少删掉多少条边才能变为森林?
- A.
16
B.21
C.15
D.6
本题共 2 分第 15 题
2020 年 8 月,第( )届全国青少年信息学奥林匹克竞赛在( )举行?
- A.
26,广州
B.26,长沙
C.37,广州
D.37,长沙
本题共 2 分第 16 题
二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填 √,错误填 ×。除特殊说明外,判断题 22 分,选择题 33 分,共计 4040 分)
#include<iostream>
using namespace std;
#define MAXN 20
int gu[MAXN][MAXN];
int luo(int n, int m) {
if(n <= 1 || m < 2)
return 1;
if(gu[n][m] != -1)
return gu[n][m];
int ans = 0;
for(int i = 0; i < m; i += 2)
ans += luo(n - 1, i);
gu[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++)
gu[i][j] = -1;
cout << luo(n, m);
return 0;
}
- 判断题
- (1 分)luo 函数中,mm 的值不可能是奇数。( )
- (1 分)若将第 1111 行的
<
改为<=
,程序的输出结果可能会改变。( ) - 若将第 8,9,138,9,13 行删除,程序的运行的结果不变( )
- 在添加合适的头文件后,将第 19 到 21 行替换为
memset(gu,255,sizeof(gu));
可以起到相同的作用( )
- 选择题
-
(4 分)若输入数据为 4 8,则输出为( )。
-
最坏情况下,此程序的时间复杂度是( )。
- 1. A.
正确
B.错误
- 2. A.
正确
B.错误
- 3. A.
正确
B.错误
- 4. A.
正确
B.错误
- 5. A.
7
B.8
C.15
D.16
- 6. A.
O(m2n)O(m2n)
B.O(nm!)O(nm!)
C.O(n2O(n2)
D.O(n2m)O(n2m)
本题共 14 分第 17 题
#include<bits/stdc++.h>
using namespace std;
int n, m;
int f[101][101];
int F[101][101];
int main() {
scanf("%d%d", &n, &m); // n的值在1到100之间
memset(f, -1, sizeof(f));
for(int i = 1; i <= m; i++) {
int u, v, w; // w的值在0到10000之间
scanf("%d%d%d", &u, &v, &w);
f[u][v] = f[v][u] = w;
}
for(int k = 1; k <= n; k++)
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(f[i][k] != -1 && f[k][j] != -1)
if(f[i][j] == -1||f[i][j]>f[k][j]+f[i][k])
f[i][j] = f[i][k] + f[k][j];
int ans = 2147483647;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++) {
for(int x = 1; x <= n; x++)
for(int y = 1; y <= n; y++)
F[x][y] = f[x][y];
F[i][j] = F[j][i] = 0;
for(int x = 1; x <= n; x++)
for(int y = 1; y <= n; y++)
if(F[x][y]==-1||F[x][y]>F[x][i]+F[i][y])
F[x][y] = F[x][i] + F[i][y];
for(int x = 1; x <= n; x++)
for(int y = 1; y <= n; y++)
if(F[x][y]==-1||F[x][y]>F[x][j]+F[j][y])
F[x][y] = F[x][j] + F[j][y];
int res = 0;
for(int x = 1; x <= n; x++)
for(int y = 1; y < x; y++)
res += F[x][y];
ans = min(res, ans);
}
printf("%d\n", ans);
return 0;
}
- 判断题
- (1 分)14 到 16 行,将外层到内层的循环变量依次调整为 i,j,ki,j,k,程序的运行的结果不变。( )
- 这个程序的时间复杂度和 mm 无关。( )
- 20 行的 ansans 如果初始化为 107107 时,可能无法得到正确结果。( )
- 若将第 27 到 30 行的部分和 31 到 34 行的两个部分互换,程序的运行的结果不变。( )
•选择题
-
若输入数据为 4 5/1 2 3/1 3 6/2 3 4/2 4 7/3 4 2(其中“/”为换行符),则输出为( )。
-
这个程序使用了( )算法。
- 1. A.
正确
B.错误
- 2. A.
正确
B.错误
- 3. A.
正确
B.错误
- 4. A.
正确
B.错误
- 5. A.
14
B.18
C.21
D.28
- 6. A.
Floyd
B.Dijkstra
C.Prim
D.Kruskal
本题共 14 分第 18 题
#include<bits/stdc++.h>
using namespace std;
#define MOD 19260817
#define MAXN 1005
long long A[MAXN][MAXN] = {0}, sum[MAXN][MAXN] = {0};
int n, m, q;
int main() {
A[1][1] = A[1][0] = 1;
for(int i = 2; i <= 1000; i++) {
A[i][0] = 1;
for(int j = 1; j <= i; j++)
A[i][j] = (A[i - 1][j] + A[i - 1][j - 1]) % MOD;
}
for(int i = 1; i <= 1000; i++)
for(int j = 1; j <= 1000; j++)
sum[i][j] = (sum[i - 1][j] + sum[i][j - 1]
- sum[i - 1][j - 1] + A[i][j] + MOD) % MOD;
int q;
cin >> q;
while(q--) {
int n, m;
cin >> n >> m;
cout << sum[n][m] << endl;
}
return 0;
}
- 判断题
- (1 分)当 i≤ji≤j 时,
A[i][j]
的值是 00。( ) - 当 i>ji>j 时,
A[i][j]
的值相当于从 ii 个不同元素中取出 jj 个元素的排列数。( ) sum[i][j]
的值(1<j<i≤10001<j<i≤1000)不小于sum[i-1][j-1]
的值。( )- 若将第 12 行改为
A[i][j]=(A[i-1][j]+A[i-1][j-1]+MOD)%MOD;
,程序的运行的结果不变。( )
- 选择题
-
(4 分)
A[i][j]
(1≤i≤10,1≤j≤101≤i≤10,1≤j≤10)的所有元素中,最大值是( )。 -
若输入数据为 1/5 3(其中“/”为换行符),则输出为( )。
- 1. A.
正确
B.错误
- 2. A.
正确
B.错误
- 3. A.
正确
B.错误
- 4. A.
正确
B.错误
- 5. A.
126
B.276
C.252
D.210
- 6. A.
10
B.35
C.50
D.24
本题共 14 分第 19 题
- (封禁 xxs)现有 nn 个 xxs(编号为 11 到 nn),每个 xxs 都有一个关注者,第 ii 个 xxs 的关注者是 aiai。现在管理员要将其中的一些 xxs 的账号封禁,但需要注意的是如果封禁了第 ii 个人,那么为了不打草惊蛇,就不能封禁他的关注者 aiai。现在想知道最多可以封禁多少个 xxs。
输入第一行是一个不超过 300000300000 的整数 nn,第二行是 nn 个 11 到 nn 的整数表示 aiai。
输出一行,一个整数表示答案。
#include <cstdio>
using namespace std;
#define MAXN 300005
int n, ans = 0, a[MAXN], in[MAXN] = {0};
bool vis[MAXN] = {0};
void dfs(int cur, int w) {
if(vis[cur])
return;
vis[cur] = true;
if(w == 1) ans++;
①
if(②)
dfs(a[cur], ③);
}
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
in[a[i]]++;
}
for(int i = 1; i <= n; i++)
if(!in[i]) ④;
for(int i = 1; i <= n; i++)
if(⑤) dfs(i, 0);
printf("%d\n", ans);
return 0;
}
-
①处应填( )
-
②处应填( )
-
③处应填( )
-
④处应填( )
-
⑤处应填( )
- 1. A.
B.a[cur]=cur;
C.in[a[cur]]=0;
D.in[a[cur]]--;
in[cur]--;
- 2. A.
B.in[a[cur]]!=0||w==1
C.in[a[cur]]==0||w==0
D.in[a[cur]]!=0||w==0
in[a[cur]]==0||w==1
- 3. A.
B.0
C.1
D.w
1-w
- 4. A.
B.dfs(i,1)
C.dfs(i,0)
D.dfs(a[i],1)
dfs(a[i],0)
- 5. A.
B.!in[i]
C.in[i]
D.!vis[i]
vis[i]
本题共 15 分第 20 题
(烧作业)某课作业布置了 N(3≤N≤100000)N(3≤N≤100000) 个题目,第 ii 题对应的得分是 aiai。作业的总得分的计算方式为去掉作业中得分最小的一个题,剩下其它所有题目得分的平均值。但很不幸小 A 遇到了一场火灾,前 K(1≤K≤N−2)K(1≤K≤N−2) 个题目被烧了,无法记录得分。小 A 想知道,KK 是多少时,可以得到最高的作业得分? 作业被烧了前 KK 页,这时的得分是从第 K+1K+1 页到最后一页中,去除最小得分后取平均值。
输入第一行是整数 NN,第二行是 nn 个不超过 1000010000 的非负整数表示 aiai。
输出一行,若干个整数表示答案。如果有多个 KK,请依次升序输出。
#include <cstdio>
#include <cmath>
#define min(a,b) (a<b?a:b)
#define MAXN 100002
using namespace std;
int n, k[MAXN], cnt = 0;
int s[MAXN], minScore, sum;
double maxAverage = 0, nowAverage;
int main() {
scanf("%d", &n);
for(int i = 1; i <= n; i++)
scanf("%d", &s[i]);
minScore = s[n];
①;
for(int i = n - 1; i >= 2; i--) {
minScore = min(minScore, s[i]);
②;
nowAverage = ③;
if(nowAverage > maxAverage) {
④
maxAverage = nowAverage;
} else if(fabs(nowAverage - maxAverage) < 1e-6)
⑤;
}
for(int i = cnt; i >= 1; i--)
printf("%d\n", k[i]);
return 0;
}
-
①处应填( )
-
②处应填( )
-
③处应填( )
-
④处应填( )
-
⑤处应填( )
- 1. A.
B.sum=n
C.sum=s[1]
D.sum=s[n]
sum=0
- 2. A.
B.sum=maxAverage*(n-i)
C.sum+=s[i]
D.sum+=s[n-i]
sum=s[i]+minScore
- 3. A.
B.(double)(sum+minScore)/(n-i)
C.sum*1.0/(n-i)
D.(int)(sum-minScore)/(n-i)
(double)(sum-minScore)/(n-i)
- 4. A.
B.k[++cnt]=i;
C.k[cnt++]=i-1
D.cnt=1;k[cnt]=i-1;
cnt=0;k[cnt]=i;
- 5. A.
B.k[cnt++]=i;
C.k[++cnt]=i-1;
D.k[cnt++]=n-i;
k[cnt]=i;
本题共 15 分
答案扔这儿,貌似没有在别处看到答案所以我是个热心的小朋友: