CSP-J 初赛模拟卷(第 17 套)
入门级 C++ 语言试题
---
#### **一、单项选择题(共 15 题,每题 2 分,共计 30 分)**
( ) 1. 十进制数 114 的相反数的8位二进制补码是:
A. 10001110 B. 10001101 C. 01110010 D. 01110011
( ) 2. 以下哪个网站不是 Online Judge(在线程序判题系统)?Online Judge 可以查看算法题目,提交自己编写的程序,然后可以获得评测机反馈的结果。
A. Luogu B. Gitee C. LeetCode D. Codeforces
( ) 3. 小A用字母A表示1,B表示2,以此来推,用 Z 表示 26。对于27以上的数,可以用两位或者更长的字符串来对应,例如AA对应27,AB 对应 28,AZ 对应52,AAA 对应703……那么BYT 字符串对应的数字是什么?
A. 2018 B. 2020 C. 2022 D. 2024
( ) 4. UIM 拍摄了一张照片,其分辨率是 4096× 2160,每一个像素都是 24位真彩色。在没有压缩的情况下,这张图片占用空间接近以下哪个值?
A. 8MB B. 25MB C. 200MB D. 200KB
( ) 5. 在一个长度为n的数组中找到第k大的数字,平均的算法时间复杂度最低的是
A. `O (n)` B. `O (nk)` C. `O (nlogn)` D. `O (n^2)`
( ) 6. 对于“树”这种数据结构,正确的有:
①一个有n个顶点、n-1 条边的图是树
②一个树中的两个顶点之间有且只有一条简单路径
③树中一定存在度数不大于 1的顶点
④树可能存在环
A. ①②④ B. ①②③ C. ②③ D. ①②
( ) 7. 博艾中学进行了一次信息学会考测试,其优、良、及格、不及格的试卷数量分别为10、13、14、5张。现在这些卷子混在一起,要将这些卷子按照等级分为4叠。分卷子的方法是,每次将一叠有不同等级答卷的卷子分为两堆,使得这两堆中没有相同等级的卷子,然后可以再分,直到分为4叠。要分完这些卷子,至少需要多少次“分卷子”的操作? 将一堆数量为n的卷子分成两堆,就会产生n次分卷子的操作。
A. 84 B. 93 C. 78 D. 85
( ) 8. 一个二叉树的前序遍历是HGBDAFEC,中遍历是BGHFAEDC,同时采用顺序存储结构,即用一维数组元素存储该二叉树中的结点(根结点的下标为1,若某结点的下标为i,则其左孩子位于下标2i处、右孩子位于下标2i+1处),则该数组的最大下标至少为( )
A. 7 B. 13 C. 15 D. 12
( ) 9. 在C++语言中,如果a=1;b=0;c=1;那么以下表达式中为1的是:
A. `a&&b||b&&c` B. `a+b>c||b` C. `!(!c&&(!a||b))` D. `a+b+c`
( ) 10. 在一个初始长度为n的链表中连续进行k次操作,每次操作是读入两个数字a_i和b_i,在链表中找到元素为a_i的结点(假设一定可以找到),然后将这b_i个元素插入到这个结点前面。在最理想的情况下,链表访问的结点数量最少可能是多少(不算将要插入的结点)?
A. n次 B. k次 C. nk次 D. `n+k次`
( ) 11. A班有5名风纪委员,B班有4名风纪委员,C班有3名风纪委员。现在需要这些同学中选取6名风纪委员巡逻,如果只关注各班派出的风纪委员人数,有几种不同的方案?
A. 9 B. 12 C. 15 D. 18
( ) 12. 以下哪种排序算法的时间复杂度是O(n^2)?
A. 计数排序 B. 插入排序 C. 希尔排序 D. 归并排序
( ) 13. 已知rand()可以生成一个0到32767的随机整数,如果希望得到一个范围在[a,b)的随机整数,a和b均是不超过100的正整数且a
2 using namespace std;
3 #define MAXN 20
4 int gu[MAXN][MAXN];
5 int luo(int n, int m) {
6 if(n <= 1 || m < 2)
7 return 1;
8 if(gu[n][m] != -1)
9 return gu[n][m];
10 int ans=0;
11 for(int i = 0; i > n >> m;
19 for(int i = 0; i < MAXN; i++)
20 for(int j = 0; j < MAXN; j++)
21 gu[i][j]= -1;
22 cout << luo(n, m);
23 return 0;
24 }
```
**判断题**
( ) 16. (1分) luo函数中,m的值不可能是奇数。( )
( ) 17. (1分) 若将第11行的“<”改为“<=”,程序的输出结果可能会改变。( )
( ) 18. (2分) 若将第8、9、13行删除,程序的运行的结果不变。( )
( ) 19. (2分) 在添加合适的头文件后,将第19 到 21 行替换为“memset(gu, 255,sizeof(gu));”可以起到相同的作用。( )
**单选题**
( ) 20. (4分) 若输入数据为 4 8,则输出为( )。
A. 7 B. 8 C. 15 D. 16
( ) 21. (3分) 最坏情况下,此程序的时间复杂度是( )。
A. $O(m^2n)$ B. $O(mn!)$ C. $O(n^2)$ D. $O(n^2m)$
**(2)**
```cpp
1 #include
2 #include
3 using namespace std;
4 int n, m;
5 int f[101][101];
6 int F[101][101];
7 int main(){
8 scanf("%d%d",&n,&m);//n的值在1到100之间
9 memset(f,-1,sizeof(f));
10 for(int i = 1; i <= m; i++) {
11 int u,v,w;//w的值在0到10000之间
12 scanf("%d%d%d",&u,&v,&w);
13 f[u][v]=f[v][u]=w;
14 }
15 for(int k = 1; k <= n; k++)
16 for(int i=1;i <=n; i++)
17 for(int j=1;j<= n; j++)
18 if(f[i][k]!=-1&&f[k][j]!=-1)
19 if(f[i][j]==-1||f[i][j]>f[k][j]+f[i][k])
20 f[i][j]=f[i][k]+f[k][j];
21 int ans=2147483647;
22 for(int i=1;i<=n;i++)
23 for(int j=1;j<=n; j++){
24 for(int x=1;x<=n; x++)
25 for(int y=1;y<=n; y++)
26 F[x][y]=f[x][y];
27 F[i][j]=F[j][i]=0;
28 for(int x=1;x<= n; x++)
29 for(int y=1;y<=n; y++)
30 if(F[x][y]==-1||F[x][y]>F[x][i]+F[i][y])
31 F[x][y]=F[x][i]+F[i][y];
32 for(int x=1;x<=n; x++)
33 for(int y=1;y<=n; y++)
34 if(F[x][y]==-1||F[x][y]>F[x][j]+F[j][y])
35 F[x][y]=F[x][j]+F[j][y];
36 int res=0;
37 for(int x=1;x<=n; x++)
38 for(int y=1;y
2 using namespace std;
3 #define MOD 19260817
4 #define MAXN 1005
5 long long A[MAXN][MAXN]={0},sum[MAXN][MAXN]={0};
6 int n, m, q;
7 int main(){
8 A[1][1]=A[1][0]=1;
9 for(int i=2;i <= 1000; i++) {
10 A[i][0]=1;
11 for(int j = 1; j <= i; j++)
12 A[i][j]=(A[i-1][j]+A[i-1][j-1])%MOD;
13 }
14 for(int i =1;i <= 1000; i++)
15 for(int j=1;j<=1000;j++)
16 sum[i][j]=(sum[i-1][j]+sum[i][j-1]
17 -sum[i-1][j-1]+A[i][j]+MOD)%MOD;
18 int q;
19 cin >> q;
20 while(q--){
21 int n, m;
22 cin >> n >> m;
23 cout << sum[n][m] << endl;
24 }
25 return 0;
26 }
```
**判断题**
( ) 28. (1分) 当i<=j时,A[i][i]的值是0。( )
( ) 29. (2分) 当i>j时,A[i][j]的值相当于从i个不同元素中取出j个元素的排列数。( )
( ) 30. (2分) sum[i][j]的值(1
2 using namespace std;
3 #define MAXN 300005
4 int n, ans=0, a[MAXN], in[MAXN]={0};
5 bool vis[MAXN]={0};
6 void dfs(int cur, int w){
7 if(vis[cur])
8 return;
9 vis[cur]=true;
10 if(w==1) ans++;
11 __(1)__
12 if(__(2)__)
13 dfs(a[cur], __(3)__);
14 }
15 int main(){
16 scanf("%d",&n);
17 for(int i=1;i <=n; i++) {
18 scanf("%d", &a[i]);
19 in[a[i]]++;
20 }
21 for(int i=1;i <= n; i++)
22 if(!in[i]) __(4)__;
23 for(int i=1;i<=n; i++)
24 if(__(5)__) dfs(i,0);
25 printf("%d\n",ans);
26 return 0;
27 }
```
( ) 34. (3分) (1)处应填
A. `a[cur]=cur;` B. `in[a[cur]]=0;` C. `in[a[cur]]--;` D. `in[cur]--;`
( ) 35. (3分) (2)处应填
A. `in[a[cur]] != 0 || w == 1` B. `in[a[cur]]==0||w==0`
C. `in[a[cur]]!=0||w==0` D. `in[a[cur]]==0||w==1`
( ) 36. (3分) (3)处应填
A. 0 B. 1 C. w D. 1-w
( ) 37. (3分) (4)处应填
A. `dfs(i,1)` B. `dfs(i,0)` C. `dfs(a[i], 1)` D. `dfs(a[i], 0)`
( ) 38. (3分) (5)处应填
A. `!in[i]` B. `in[i]` C. `!vis[i]` D. `vis[I]`
**(2)**
(烧作业)某课作业布置了N(3≤N≤10000)个题目,第i题对应的得分是a。作业的总得分的计算方式为去掉作业中得分最小的一个题,剩下其它所有题目得分的平均值。但很不幸小A遇到了一场火灾,前K(1
2 #include
3 #define min(a,b)(a=2;i--) {
16 minScore=min(minScore,s[i]);
17 __(2)__;
18 nowAverage=__(3)__;
19 if(nowAverage> maxAverage){
20 __(4)__
21 maxAverage=nowAverage;
22 } else if(fabs(nowAverage-maxAverage)<1e-6)
23 __(5)__;
24 }
25 for(int i=cnt; i >= 1; i--)
26 printf("%d\n",k[i]);
27 return 0;
28 }
```
( ) 39. (3分) (1)处应填
A. `sum=n` B. `sum=s[1]` C. `sum=s[n]` D. `sum=0`
( ) 40. (3分) (2)处应填
A. `sum=maxAverage*(n-i)` B. `sum+=s[i]`
C. `sum+=s[n-i]` D. `sum=s[i]+minScore`
( ) 41. (3分) (3)处应填
A. `(double)(sum+minScore)/(n-i)` B. `sum*1.0/(n-i)`
C. `(int)(sum-minScore)/(n-i)` D. `(double)(sum-minScore)/(n-i)`
( ) 42. (3分) (4)处应填
A. `k[++cnt]=i;` B. `k[cnt++]=i-1`
C. `cnt=1;k[cnt]=i-1;` D. `cnt=0;k[cnt]=I;`
( ) 43. (3分) (5)处应填
A. `k[cnt++]=i;` B. `k[++cnt]=i-1;` C. `k[cnt++] =n-i;` D. `k[cnt]=i;`