CSP-X初赛模拟赛3
该比赛已结束,您无法在比赛模式下递交该题目。您可以点击“在题库中打开”以普通模式查看和递交本题。
一、单项选择题(单项选择 15 每题2分,共30分)
1.中国计算机学会于( )年创办全国青少年计算机程序设计竞赛。{{ select(1) }}
- 1983
- 1984
- 1985
- 1986
2.第12届IOI(国际信息学奥林匹克竞赛)于( )年在北京举办。{{ select(2) }}
- 2008
- 2001
- 2000
- 1998
3.以下哪一种语言不是编译型语言( )。{{ select(3) }}
- C语言
- C++语言
- Pascal
- Python
4.中国国家标准汉字信息交换编码是( )。{{ select(4) }}
- GB 2312-80
- GBK
- UCS
- BIG-5
5.下列四种不同数制表示的数中,数值最小的一个是{{ select(5) }}
- 八进制数52
- 十进制数44
- 十六进制数2B
- 二进制数101001
6.若x=2,y=3,则x&y的结果是( )。{{ select(6) }}
- 0
- 2
- 3
- 5
7.已知L是带头节点的单链表,节点P既不是头节点(第一个节点),也不是尾节点,删除P节点直接后继节点的语句序列是( )。{{ select(7) }}
P=P->next;P->next=P;P->next=P->next->next;P=P->next->next;
8.不属于链表特点的是( )。{{ select(8) }}
- 适用频繁插入
- 适用于频繁删除
- 存取速度快
- 方便扩充
9.一棵完全二叉树第六层有9个叶结点(根为第一层),则结点个数最多有( ){{ select(9) }}
- 112
- 111
- 107
- 109
- 所谓数据封装就是将一组数据和与这组数据有关操作组装在一起,形成一个实体,这实体也就是( )。{{ select(10) }}
- 函数体
- 对象
- 类
- 数据块
11.下列( )是冯·诺依曼机工作方式的基本特点。{{ select(11) }}
- 多指令流单数据流
- 按地址访问并顺序执行指令
- 堆栈操作
- 存储器按内容选择地址
12.用1、2、3、4、5这5个数字,组成没有重复数字的三位数,其中偶数共有( )个。{{ select(12) }}
- 24个
- 30个
- 40个
- 60个
13.有黑、白、黄筷子各8只,不用眼睛看,任意地取出筷子来,使得至少有两双筷子不同色,那么至少要取出( )只筷子才能做到?{{ select(13) }}
- 10
- 11
- 12
- 13
14.请阅读以下程序,选择程序输出的结果( )。
1 #include <iostream>
2 using namespace std;
3 int f(int n);
4 int main()
5 {
6 cout<<f(5);
7 cout<<f(8)<<endl;
8 return 0;
9 }
10 int f(int n)
11 {
12 int a=2,b=0;
13 a+=n;
14 b+=a;
15 return b;
16 }
A:
710
B:
715
C:
790
D:
79
请选择输出结果:{{ select(14) }}
- A
- B
- C
- D
15.下列排序中不稳定的是( )。{{ select(15) }}
- 冒泡排序
- 归并排序
- 插入排序
- 堆排序
二、阅读程序(共34分:16,17,22,23四道题每题两分,18,19,20,24,25,26六道题每题三分,21,27两道题每题四分)
阅读1:
1 #include <bits/stdc++.h>
2 using namespace std;
3 bool pd(long long n)
4 {
5 if(n == 1)
6 return false;
7 for(long long i = 2;i<n;i++)
8 if(n%i == 0) return false;
9 return true;
10 }
11 int main(){
12 long long n,i,c = 0;
13 int INF = 1<<30;
14 scanf("%d",&n);
15 for(i = 2;i<=INF;i++)
16 {
17 if(pd(i))
18 {
19 c++;
20 if(c == n)
21 {
22 printf("%d",i);
23 return 0;
24 }
25 }
26 }
27 printf("\nover");
28 return 0;
29 }
判断题:
16.上述代码中,若将第13行修改为INF=1<<40,则输出结果一定不变。(){{ select(16) }}
- 正确
- 错误
17.上述代码中,将第23行修改为break或continue这两种情况后,有相同的输入,在这两种情况下,输出结果也一定相同。(){{ select(17) }}
- 正确
- 错误
18.上述代码中,将第23行修改break后,有相同的输入,变量c的值和为修改前一定相同。(){{ select(18) }}
- 正确
- 错误
19.上述代码中,将第23行修改为break后,有相同的输入,输出结果也一定相同。(){{ select(19) }}
- 正确
- 错误
选择题:
20.输入为:8, 输出为(){{ select(20) }}
- 17
- 19回车 over
- 19
- 23\nover
21.上述代码中,将第6行的i<n修改为( )后功能不变,效率更高。{{ select(21) }}
i*i<=ni<n/2i<n/3i<n/4
阅读2:
1 #include <bits/stdc++.h>
2 using namespace std;
3 int a[100][100];
4 int b[100][100];
5 int f(int m,int n){
6 if(m<=0 || n<=0)
7 return 0;
8 a[0][0] = b[0][0];
9 for(int i = 1;i<n;i++) a[0][i] = a[0][i-1]+b[0][i];
10 for(int i = 1;i<m;i++) a[i][0] = a[i-1][0]+b[i][0];
11 for(int i = 1;i<m;i++){
12 for(int j = 1;j<n;j++){
13 a[i][j] = min(a[i-1][j],a[i][j-1])+b[i][j];
14 }
15 }
16 return a[m-1][n-1];
17 }
18 int main()
19 {
20 int m,n;
21 cin >> m>>n;
22 for(int i = 0;i<m;i++){
23 for(int j = 0;j<n;j++){
24 cin >> b[i][j];
25 }
26 }
27 cout << f(m,n);
28 return 0;
29 }
判断题:
22.上述代码实现了对一个长度为m*n的二维数组寻找每一行上的最小值进行求和。(){{ select(22) }}
- 正确
- 错误
23.上述代码如果删除第4行,其他地方的b数组都改成a数组,那么结果不变。(){{ select(23) }}
- 正确
- 错误
选择题:
24.若输入数据为:
4 4
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
则输出的结果为()。{{ select(24) }}
- 28
- 16
- 136
- 46
25.上述代码的时间复杂度为()。{{ select(25) }}
- O(min(m,n))
- O(mn+mn+m+n)
- O(m*n)
- O(mn+nn)
26.我们将上述算法称为()。{{ select(26) }}
- 深度搜索
- 广度搜索
- 动态规划
- 贪心
27.上述代码若删除第4行,其他地方的b数组都改成a数组,输入数据为:
3 3
1 2 3 4 5 6 7 8 9
则输出的结果为()。{{ select(27) }}
- 20
- 12
- 11
- 21
阅读3:
1 #include <iostream>
2 #include <vector>
3
4 using namespace std;
5
6 void merge(vector<int>& arr, int l, int m, int r) {
7 int n1 = m - l + 1;
8 int n2 = r - m;
9
10 vector<int> L(n1), R(n2);
11
12 for (int i = 0; i < n1; i++)
13 L[i] = arr[l + i];
14 for (int i = 0; i < n2; i++)
15 R[i] = arr[m + 1 + i];
16
17 int i = 0, j = 0, k = l;
18 while (i < n1 && j < n2) {
19 if (L[i] <= R[j]) {
20 arr[k] = L[i];
21 i++;
22 } else {
23 arr[k] = R[j];
24 j++;
25 }
26 k++;
27 }
28
29 while (i < n1) {
30 arr[k] = L[i];
31 i++;
32 k++;
33 }
34
35 while (j < n2) {
36 arr[k] = R[j];
37 j++;
38 k++;
39 }
40 }
41
42 void mergeSort(vector<int>& arr, int l, int r) {
43 if (l >= r)
44 return;
45
46 int m = l + (r - l) / 2;
47 mergeSort(arr, l, m);
48 mergeSort(arr, m + 1, r);
49 merge(arr, l, m, r);
50 }
51
52 int main() {
53 int n;
54 cin >> n;
55 vector<int> arr(n);
56 for (int i = 0; i < n; i++) {
57 cin >> arr[i];
58 }
59
60 mergeSort(arr, 0, n - 1);
61
62 for (int i = 0; i < n; i++) {
63 cout << arr[i] << " ";
64 }
65 cout << endl;
66
67 return 0;
68 }
判断题
- 如果输入的数组已经有序,那么程序的输出不会改变数组的顺序。( ){{ select(28) }}
- 正确
- 错误
- 此程序的最坏时间复杂度是O(n^2)。( ){{ select(29) }}
- 正确
- 错误
- 此算法会基于原数组排序,不需要开辟额外的存储空间。( ){{ select(30) }}
- 正确
- 错误
单选题
- 如果将第 48 行代码 mergeSort(arr, m + 1, r); 修改为 mergeSort(arr, l, r);,那么程序将如何表现?{{ select(31) }}
- 正常工作,输出排序后的数组
- 导致程序崩溃或死循环
- 输出错误的排序结果
- 输出与原程序相同的结果
- 如果输入数组为 [10, -1, 3, 7],程序的输出将为( ){{ select(32) }}
- -1 3 7 10
- 10 7 3 -1
- -1 10 3 7
- 7 -1 3 10
- 对于一个包含 16 个元素的数组,归并排序的递归调用的最大层数是多少?{{ select(33) }}
- 2
- 4
- 5
- 16
完善程序(每道题4分,共36分)
完善1:
斐波那契数列为1,1,2,3,5,8,13,21,...,其元素产生的规则是前两个数为1,从第三个数开始每个数等于它前面两个数之和。已知任意一个正整数可以表示为若干个互不相同的斐波那契数之和。例如:36 = 21+13+2。
下面的程序是由键盘输入一个正整数n,输出组成n的互不相同的斐波那契数。
算法说明:
1)寻找小于等于n的最大斐波那契数a,并以a作为组成n的一个数。
2)若n!=a,则以n-a作为n的新值,重复步骤1)。若a = n,则结束。
1 #include<iostream>
2 #include<cstdio>
3 using namespace std;
4 int n;
5 bool fisrt;
6 int find(int n)
7 {
8 int a,b,c;
9 a = 1;b=1;
10 do
11 {
12 c = a+b;
13 ____1______;
14 }while(b<n);
15 if(_____2______)
16 return b;
17 else
18 ______3______;
19 }
20 void p(int n)
21 {
22 int a;
23 a = find(n);
24 if(first)
25 {
26 printf("%4d",a);
27 first = false;
28 }else
29 _______4_______;
30 if(a<n) _____5______;
31 }
32 int main()
33 {
34 cin >> n;
35 first = true;
36 printf("%5d = ",n);
37 p(n);
38 cout << endl;
39 return 0;
40 }
34)1处应填()。{{ select(28) }}
- a = c;b = a
- a = b;b = c
- a == c;b == a
- a == b;b == c
35)2处应填()。{{ select(29) }}
- b==n
- b<n
- a == n
- a<n
36)3处应填()。{{ select(30) }}
- return c
- return b
- return a+b
- return a
37)4处应填()。{{ select(31) }}
printf(" %4d",a)printf(" + %4d",a)printf(" %4d",b)printf(" + %4d",b)
38)5处应填()。{{ select(32) }}
- p(a)
- p(b)
- p(n-a)
- p(n-b)
完善2:
给你n个数,分别是a[1],a[2],...,a[n]。求一个最长的区间[x,y],使得区间中的数(a[x],a[x+1],a[x+2],...,a[y-1],a[y])的和能被7整除。输出区间长度。若没有符合要求的区间,输出0。
#include <bits/stdc++.h>
using namespace std;
int book[7];
int a[55000],sum[55000];
int main(){
memset(book,-1,sizeof book);
book[0]=(1)______;
int n;
cin>>n;
int ans=0;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
(2)______;
}
for(int i=1;i<=n;i++){
sum[i]%=7;
}
for(int i=1;i<=n;i++){
if((3)______){
book[(4)______]=i;
}
else ans=max(ans,(5)______);
}
cout<<ans<<endl;
return 0;
}
39)1处应填()。{{ select(33) }}
- 0
- 1
- 2
- 7
40)2处应填()。{{ select(34) }}
- sum[i]=a[i]
- sum[i]=a[i]+a[i-1]
- sum[i]+=a[i]
- sum[i]=sum[i-1]+a[i]
41)3处应填()。{{ select(35) }}
- book[sum[i]]==-1
- book[i]==-1
- book[sum[i]]!=-1
- book[i]!=-1
42)4处应填()。{{ select(36) }}
- i
- sum[i]
- a[i]
- sum[i]+a[i]
43)5处应填()。{{ select(37) }}
- sum[i]
- book[sum[i]]
- i-sum[i]
- i-book[sum[i]]