#C1217. 2024CSPJ初赛模拟题(八)

2024CSPJ初赛模拟题(八)

一、单项选择题

共15题,每题2分,共计30分;

  1. 十六进制数(-73)16的8位二进制补码是()。 {{ select(1) }}
  • 10001110
  • 10001101
  • 01110010
  • 01110011
  1. 以下关于CSP-J/S的描述错误的是()。 {{ select(2) }}
  • CSP-J/S非专业认证在校生与在职人员皆可参加
  • CSP-J/S是中国计算机学会举办的程序设计竞赛
  • CSP-J/S属于NOI系列赛事
  • CSP-J/S第二轮实现网上注册、报名,未通过网上报名的认证者可 以向本省特派员申请获得第二轮认证资格
  1. 以下语言中,同时符合面向对象和解释执行的是什么语言()。 {{ select(3) }}
  • Python
  • Fortran
  • C++
  • Pascal
  1. 某足校买了一台小米的4K 超清电视,其屏幕分辨率是4096×2160,每一 个像素都是32位真彩色,一个足球比赛的视频文件有4分钟,每秒钟播放24 帧。在无压缩情况下请计算这个视频占用空间最接近以下哪个值()。 {{ select(4) }}
  • 90 GB
  • 125 GB
  • 200 GB
  • 100 GB
  1. 假设一个待排序数组已基本有序,以下排序算法效率最高的是()。 {{ select(5) }}
  • 插入排序
  • 快速排序
  • 归并排序
  • 选择排序
  1. 一棵包含m 个分支结点(也就是度不为0的节点)的非空满n 叉树,其中 n≥1, 这棵树的度为0的结点(叶子结点)数目为()。 {{ select(6) }}
  • mn+1
  • mn-1
  • nm+m-1
  • nm-m+1
  1. 前缀表达式-*1+234的后缀表达式是()。 {{ select(7) }}
  • 1234*+-
  • 123+*4-
  • 123*+4-
  • -+*1234
  1. 关于CPU 的说法如下哪个是正确的?() {{ select(8) }}
  • CPU 只有Intel 和 AMD 公司才能生产
  • Intel公司发明了世界上最早的CPU
  • CPU 能直接运行机器语言
  • 现在有昂贵的GPU, 不需要CPU 台式电脑也可以正常运行
  1. 关于计算机网络,下面的说法哪些是正确的?() {{ select(9) }}
  • 网络协议之所以分层主要是新技术需要兼容历史上老的实现方案
  • 由于网络地址不够用,新一代互联网使用的IPv5标准的地址
  • TCP/IP是互联网的基础协议族,包含有传输层和网络层的通信协议
  • 互联网上每一台主机都需要一个IPv6 地址才能正常工作
  1. 设某哈希表的地址空间为0到10,对应散列函数为hash(n)=n%11, 如 果用线性探查法解决碰撞。从空的哈希表开始,依次插入关键码值71,25, 84,57,38,则最后一个关键码38的地址为()。 {{ select(10) }}
  • 3
  • 6
  • 4
  • 5
  1. 现在有一个十进制数0.125,它等于十六进制数的多少?() {{ select(11) }}
  • 0.10
  • 0.80
  • 0.40
  • 0.20
  1. 以下逻辑表达式里面不管A,B 如何取值恒为真的是?() {{ select(12) }}
  • (¬A∩B)V(A∩B)VA
  • (¬A∩B)V(A∩¬B)VB
  • (¬A∩B)V(A∩¬B)VBVA
  • (¬A∩B)V(A∩¬B)VAV¬B
  1. 函数rand() 可以生成一个0到32767范围的随机整数,现在希望得到一 个范围在[a,b]的随机整数,a 和b 都是正整数并且都不超过1024同时还有 a<b, 那么下述表达式哪个是可行的?() {{ select(13) }}
  • rand()%(b-a)+a
  • rand()%(b-a+1)+a
  • rand()%(b-a)+a+1
  • rand()%(b-a+1)+a+1
  1. 某学校1位领队带5名参加python竞赛的队员和4名参加C++竞赛的队员排成一行拍照留念,要求参加python竞赛的队员必须排在一起,领队必须在中间,参加C++竞赛的队员也必须排在一起,一共有()种不同的排列方式。 {{ select(14) }}
  • 11520
  • 5760
  • 2880
  • 8640
  1. 有11个结点的非连通无向图最多有()条边。 {{ select(15) }}
  • 55
  • 90
  • 72
  • 45

二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填√, 错误填×;除特殊说明外,判断题1.5分,选择题3分,共计40分)

01 #include<iostream>
02 using namespace std;
03 int main() 
04 {
05    int  x,y,z,W;
06    cin>>x>>y>>z;
07    X=X^y;
08    y=X^y;
09    X=X^y;
10    z=x/y;
11    W=z&(z-1);
12    cout<<x<<" "<<y<<" "<<z<<" "<<w;
13    return 0; 
14 }

▶判断题

  1. 若输入4 8 1,则x,y,z的输出结果为8 4 2。 ( ) {{ select(16) }}
  • 正确
  • 错误
  1. 若输入987654321 9 1, 输出y、z分别是987654321和109739369 ( ) {{ select(17) }}
  • 正确
  • 错误
  1. 若输入9 2023 9,则输出w 是192。 ( ) {{ select(18) }}
  • 正确
  • 错误
  1. 将第1行头文件#include替换成#include, 第12 行替换为printf("%d %d %d %d\n",x,y,z,w);程序运行结果不会改变。() {{ select(19) }}
  • 正确
  • 错误

▶选择题

  1. 若输入数据为3113,则输出为()。 {{ select(20) }}
  • 11333
  • 11332
  • 31132
  • 31133
  1. 若将10行z=x/y改成z=x%y,输入0 2023 9,则输出是()。 {{ select(21) }}
  • 2023001
  • 2023091
  • 0202391
  • 程序出错无输出
01 #include<bits/stdc++.h>
02 using namespace std;
03  int  n,m,total,a[105],b[105];
04 int fun(int x,int y) 
05 {
06     if(0==y)
07        return 1;
08    else
09       return fun(x,y-1)*x;
10 }
11 int main() 
12 {
13     intj=2;
14     scanf("%d",&n);
15     while(1 !=n) 
16     {
17         if(0==n%j)
18         {
19             ++m;
20             a[m]=j;
21             while(0==n%j)
22             {
23                ++b[m];
24                n=n/j;
25             } 
26        }
27       ++j; 
28     }
29     total=1;
30     for(int  k=1;k<=m;++k) 
31     {
32        total*=(a[k]-1)*fun(a[k],b[k]-1);
33     }
34     printf("%d",total);
35     return 0;
36}

▶判断题

  1. 不管n 输入什么值,程序的输出值 total一定不比输入值n 小 。 () {{ select(22) }}
  • 正确
  • 错误
  1. 若输入n 是一个大于2的质数,则输出total 不可能是质数。 () {{ select(23) }}
  • 正确
  • 错误
  1. 若输入n 是一个质数,程序执行到第29行时,j 的值等于输入的n 。() {{ select(24) }}
  • 正确
  • 错误
  1. 若输入n 的值等于某正整数c 的正整数d 次方 c^d (c,d>=2), 程序的第15 行循环执行完成后,m 的值为1,a[1]的值为c。() {{ select(25) }}
  • 正确
  • 错误

▶选择题

  1. 若输入n=4800, 则输出total 为 ( ) 。 {{ select(26) }}
  • 1280
  • 640
  • 4800
  • 960
  1. 若输出total=4800,则输入n 可能为()。 {{ select(27) }}
  • 4800
  • 18000
  • 9000
  • 7200
01 #include <bits/stdc++.h>
02 using namespace std;
03 char last[101],ch;
04 int main() 
05{
06     int  n,length=0;
07     scanf("%d",&n);
08     for (int i=0;i<=n;i++){
09         cin>>ch;
10         if(ch>=last[length])
11             last[++length]=ch;
12         else  if(ch<last[l])
13             last[l]=ch;
14         else  {
15             int 1=1,r=length,mid;
16        	   while  (l<r-1){
17                 mid=(l+r)/2;
18                 if(last[mid]<=ch)
19                     l=mid;
20    			   else  r=mid; 
21   	       }
22   	       last[r]=ch; 
23         }
24     }
25     printf("%d\n",length);
26     return  0; 
27 }

▶判断题

  1. 要使输出等于n, 输入的所有字符必须满足第i 个字符ASCII 整数值小于 第i+1 个字符的ASCII整数值(1<=i<=n-1) 。 () {{ select(28) }}
  • 正确
  • 错误
  1. 若输入数字个数超过101个,一定会发生数组下标溢出。 () {{ select(29) }}
  • 正确
  • 错误
  1. 将第17行替换为mid=1+(r-1)>>1), 程序运行结果不会改变。 () {{ select(30) }}
  • 正确
  • 错误
  1. 程序运行过程中,变量r 的值可能会等于n。 () {{ select(31) }}
  • 正确
  • 错误

▶选择题 (最后一题4分)

  1. 第22行last[r]=ch最多会运行( )次。 {{ select(32) }}
  • 1
  • n-2
  • n-1
  • n
  1. 若输入n=100, 且第16行的 while 循环运行了至少一次,那么输出结果 不可能是( )。 {{ select(33) }}
  • 2
  • 3
  • 98
  • 100
  1. 若输入数据为5 b c d a e a,则 输出是()。 {{ select(34) }}
  • 4
  • 2
  • 5
  • 3

三、完善程序(单选题,每小题3分,共计30分)

1.家住农村的小明同学想去最要好的朋友刘东家去玩,刚好前段时间台风弄的到处都是泥水坑,小明家在坐标(0,0)的位置,刘东家在坐标(X,Y)的位置(-100<=X,Y<=100),小明看到地上N(1<=N<=1000)个泥水坑, 每个泥水坑的坐标为(Ai,Bi)位置(-100<=Ai,Bi<=100),他不想弄脏白色运动鞋,小明只能平行坐标轴一格一格移动(不能走斜对角线或者跳格,每格路径长度为1),为了避开泥水坑并尽快赶到刘东家,至少要走多少路?

如果有路打印出路径长度,没有路打印“No Answer”。

输入描述: 第一行输入X,Y,N。 第二行到N+1行输入N个数对Ai,Bi。 输出描述: 输出一个整数,如果通过按字符不能使初始字符串变为最终字符串,则输出0,否则输出最少需要按几次字符可以使初始字符串变为最终字符串。

样例输入

1 2 7
0 2
-1 3
3 1
1 1
4 2
-1 1
2 2

样例输出

11
01 #include<bits/stdc++.h>
02 using namespace std;
03 bool a[1005][1005],v[1005][1005];
04 struct point 
05{
06  int  x,y,step; 
07};
08 intdx[4]={0,1,0,-1},dy[4]={1,0,-1,0};
09 queue<point>r;
10 int main() 
11{
12    int  n,startx,starty,p,q;
13    cin>>startx>>starty>>n;
14    startx+=100,starty  +=100,p=100,q=100;
15    for(inti=1;i<=n;i++) 
16    {
17         intj,k;
18         cin>>j>>k; 
19         ①=true;   
20    }
21    point start;
22    start.x=startx;
23    start.y=starty;
24    start.step=0;
25    r.push(start);
26    v[startx][starty]=true;
27    int flag=0;
28    while(!r.empty()
29    {
30        int    x=r.front().x; 
31        int    y=r.front().y; 
32        if(x==p &&y==q)
33        {
34            printf("%d",r.front().step); 
35				②;
36            break;
37		   }
38		   for(int k=0;③;k++)
39		   {
40				int tx,ty;
41				tx=x+dx[k]; 
42				ty=y+dy[k];
43				if(a[tx][ty]==false&&v[tx][ty]==false)
44				{
45					point   temp; 
46					temp.x=tx;
47					temp.y=ty;
48					temp.step=④; 
49					r.push(temp);
50					⑤=true;
51				}
52			}
53			r.pop()
54	  }	
55	  if(flag == 0)
56		  printf("no answer");
57    return 0;
58 }
  1. ①处应填() {{ select(35) }}
  • a[j+100][k+100]
  • a[j][k]
  • a[j+100][k]
  • a[j][k+100]
  1. ②处应填() {{ select(36) }}
  • fag=0
  • fag=1
  • v[tx][ty]=true
  • v[tx][ty]=false
  1. ③处应填() {{ select(37) }}
  • k<=3
  • k<=4
  • k<=n
  • k<=r.front().step
  1. ④处应填() {{ select(38) }}
  • start.step
  • start.step+1
  • r.front().step+1
  • r.front().step
  1. ⑤处应填() {{ select(39) }}
  • a[tx+1][ty+1]
  • v[tx+1][ty+1]
  • a[tx][ty]
  • v[tx][ty]
  1. 在大规模数据处理中,经常需要处理 Top N问题:在乱序数据中找到前N 个数据。例如在海量搜索结果中找到权重最高的前N 个结果。如下代码是一 个经典的堆排序过程,请补充完整全部程序。
1 #include <cstdio>
2 #include <algorithm> 
3 using namespace std;
4 void heap_handle(int *a,int index,int num) 
5{
6    int left=2*index;
7    int right=2*index+1;
8    int maxroot=index;
9    if(index<=num/2) 
10   {
11      if(①) 
12      {
13          maxroot=left; 
14      }
15      if(②)
16      {
17          maxroot=right; 
18      }
19      if(③)
20      {
21          swap(a[index],a[maxroot]); 
22          ④;
23      }
24    } 
25  }
26 void build_heap(int *a,int num)
27 {
28     for(inti=num/2;i>=1;--i) 
29     {
30         heap_handle(a,i,num); 
31     }
32 }
33 void heap_sort(int*a,int   num) 
34 {
35    int i;
36    build_heap(a,num);
37    for(i=num;i>=1;--i) 
38    {
39       swap(a[1],a[i]); 
40       ⑤;
41    } 
42 }
43  void  display(int*a,int  num) 
44 {
45    for(inti=1;i<=num;++i) 
46    {
47       printf("%d",a[i]); 
48    }
49    printf("\n"); 
50 }
51 int main() 
52 {
53    int n;
54    scanf("%d",&n);
55    inta[n+1];
56    for(inti=1;i<=n;i++) 
57    {
58       scanf("%d",a+i);
59    }
60
61    heap_sort(a,n); 
62    display(a,n);
63    return 0;
64 }
  1. ①处应填() {{ select(40) }}
  • left>num &&a[left]>a[maxroot]
  • left<=num &&a[left]>a[maxroot]
  • right>num &&a[right]>a[maxroot]
  • right<=num &&a[right]>a[maxroot]
  1. ②处应填() {{ select(41) }}
  • left>num && a[left]>a[maxroot]
  • left<=num && a[left]>a[maxroot]
  • right>num && a[right]>a[maxroot]
  • right<=num && a[right]>a[maxroot]
  1. ③处应填() {{ select(42) }}
  • maxroot
  • maxroot!=index
  • maxroot%2
  • maxroot<=num
  1. ④处应填() {{ select(43) }}
  • heap_handle(a,index,num)
  • heap_handle(a,maxroot,num)
  • heap_handle(a,maxroot-1,num)
  • heap_handle(a,maxroot,num/2)
  1. ⑤处应填() {{ select(44) }}
  • heap_handle(a,1,i)
  • heap_handle(a,1,i+1)
  • heap_handle(a,1,i-1)
  • heap_handle(a,1,num)