#C. CSP-X初赛模拟赛3

    客观题

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
  1. 所谓数据封装就是将一组数据和与这组数据有关操作组装在一起,形成一个实体,这实体也就是( )。{{ 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<=n
  • i<n/2
  • i<n/3
  • i<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 }

判断题

  1. 如果输入的数组已经有序,那么程序的输出不会改变数组的顺序。( ){{ select(28) }}
  • 正确
  • 错误
  1. 此程序的最坏时间复杂度是O(n^2)。( ){{ select(29) }}
  • 正确
  • 错误
  1. 此算法会基于原数组排序,不需要开辟额外的存储空间。( ){{ select(30) }}
  • 正确
  • 错误

单选题

  1. 如果将第 48 行代码 mergeSort(arr, m + 1, r); 修改为 mergeSort(arr, l, r);,那么程序将如何表现?{{ select(31) }}
  • 正常工作,输出排序后的数组
  • 导致程序崩溃或死循环
  • 输出错误的排序结果
  • 输出与原程序相同的结果
  1. 如果输入数组为 [10, -1, 3, 7],程序的输出将为( ){{ select(32) }}
  • -1 3 7 10
  • 10 7 3 -1
  • -1 10 3 7
  • 7 -1 3 10
  1. 对于一个包含 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。 1N50,0001 \leq N \leq 50,000 1a[i]1,000,0001 \leq a[i] \leq 1,000,000

#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]]

CSP-X/CSP-J初赛模拟题

未认领
状态
已结束
题目
6
开始时间
2024-8-24 0:00
截止时间
2024-9-30 23:59
可延期
24 小时