2023年CSP-J 普及组第一轮题目和答案详解

2023-09-21 10:27:56
家人们首战报捷!!!!
才教了一个月的学生,赛前一周才报名CSP-J都没提前安排初赛内容临时周内加了两节课,
总共初赛也就上了3次课准备了不到一周半,压线进了复赛,
不得不说学生基础还不错,脑子也转的快,接受程度嘎嘎强,茶馆也好喝家人们钱不钱无所谓主要是爱教课。
复赛加油冲了!

2023年CSP-J (题目和答案)

ps:详解之后更新

一、 单项选择题(共15题,每题2分,共计30分:每题有且仅有一个正确选项)

  1. 在C++中,下面哪个关键字用于声明一个变量,其值不能被修改?( )。
    A. unsigned
    B. const
    C. static
    D. mutable
    答案 B

  2. 八进制数123456708 和076543218的和为( )。
    A. 222222218
    B. 211111118
    C. 221111118
    D. 222222118
    答案 D

  3. 阅读下述代码,请问修改data的value成员以存储3.14,正确的方式是( )。

union Data{
    int num;
    float value;
    char symbol;
};
union Data data;

A. d a t a . v a l u e = 3.14 ; data.value = 3.14; data.value=3.14;
B. v a l u e . d a t a = 3.14 ; value.data = 3.14; value.data=3.14;
C. d a t a − > v a l u e = 3.14 ; data->value = 3.14; data>value=3.14;
D. v a l u e − > d a t a = 3.14 ; value->data = 3.14; value>data=3.14;
答案 A
4. 假设有一个链表的节点定义如下:

struct Node {
     int data;
     Node* next;
};

现在有一个指向链表头部的指针:Node* head。如果想要在链表中插入一个新节点,其成员data的值为42,并使新节点成为链表的第一个节点,下面哪个操作是正确的?( )
A. N o d e ∗ n e w N o d e = n e w N o d e ; n e w N o d e − > d a t a = 42 ; n e w N o d e − > n e x t = h e a d ; h e a d = n e w N o d e ; Node* newNode = new Node; newNode->data = 42; newNode->next = head; head = newNode; NodenewNode=newNode;newNode>data=42;newNode>next=head;head=newNode;
B. N o d e ∗ n e w N o d e = n e w N o d e ; h e a d − > d a t a = 42 ; n e w N o d e − > n e x t = h e a d ; h e a d = n e w N o d e ; Node* newNode = new Node; head->data = 42; newNode->next = head; head = newNode; NodenewNode=newNode;head>data=42;newNode>next=head;head=newNode;
C. N o d e ∗ n e w N o d e = n e w N o d e ; n e w N o d e − > d a t a = 42 ; h e a d − > n e x t = n e w N o d e ; Node* newNode = new Node; newNode->data = 42; head->next = newNode; NodenewNode=newNode;newNode>data=42;head>next=newNode;
D. N o d e ∗ n e w N o d e = n e w N o d e ; n e w N o d e − > d a t a = 42 ; n e w N o d e − > n e x t = h e a d ; Node* newNode = new Node; newNode->data = 42; newNode->next = head; NodenewNode=newNode;newNode>data=42;newNode>next=head;
答案 A
5. 根节点的高度为1,一根拥有2023个节点的三叉树高度至少为( )。
A. 6
B. 7
C. 8
D. 9
答案 C
6. 小明在某一天中依次有七个空闲时间段,他想要选出至少一个空闲时间段来练习唱歌,但他希望任意两个练习的时间段之间都有至少两个空闲的时间段让他休息,则小明一共有
( )种选择时间段的方案。
A. 31
B. 18
C. 21
D. 33
答案 B
7. 以下关于高精度运算的说法错误的是( )。
A. 高精度计算主要是用来处理大整数或需要保留多位小数的运算。
B. 大整数除以小整数的处理的步骤可以是,将被除数和除数对齐,从左到右逐位尝试将除数乘以某个数,通过减法得到新的被除数,并累加商。
C. 高精度乘法的运算时间只与参与运算的两个整数中长度较长者的位数有关。
D. 高精度加法运算的关键在于逐位相加并处理进位。
答案 C
8. 后缀表达式“6 2 3 + - 3 8 2 / + * 2 ^ 3 +”对应的中缀表达式是( )
A. ((6 - (2 + 3)) * (3 + 8 / 2)) ^ 2 + 3
B. 6 - 2 + 3 * 3 + 8 / 2 ^ 2 + 3
C. (6 - (2 + 3)) * ((3 + 8 / 2) ^ 2) + 3
D. 6 - ((2 + 3) * (3 + 8 / 2)) ^ 2 + 3
答案 A
9. 数 10101 0 ( 2 ) 101010_{(2)} 101010(2) 16 6 ( 8 ) 166_{(8)} 166(8)的和为( )。
A. 1011000 0 ( 2 ) 10110000_{(2)} 10110000(2)
B. 23 6 ( 8 ) 236_{(8)} 236(8)
C. 15 8 ( 10 ) 158_{(10)} 158(10)
D. A 0 ( 16 ) A0_{(16)} A0(16)
答案 D
10. 假设有一组字符{a,b,c,d,e,f},对应的频率分别为5%,9%,12%,13%,16%,45%。请问以下哪个选项是字符a,b,c,d,e,f分别对应的一组哈夫曼编码?( )
A. 1111,1110,101,100,110,0
B. 1010,1001,1000,011,010,00
C. 000,001,010,011,10,11
D. 1010,1011,110,111,00,01
答案 A
11. 给定一棵二叉树,其前序遍历结果为:ABDECFG,中序遍历结果为:DEBACFG。请问这棵树的正确后序遍历结果是什么?( )
A. EDBFGCA
B. EDBGCFA
C. DEBGFCA
D. DBEGFCA
备注:
A选项更正为:EDBGFCA
B选项更正为:EDGBFCA

答案 A
12. 考虑一个有向无环图,该图包括4条有向边:(1,2),(1,3),(2,4),和(3,4)。以下哪个选项是这个有向无环图的一个有效的拓扑排序?( )
在这里插入图片描述

A. 4,2,3,1
B. 1,2,3,4
C. 1,2,4,3
D. 2,1,3,4
答案 B
13. 在计算机中,以下哪个选项描述的数据存储容量最小?( )
A. 字节(byte)
B. 比特(bit)
C. 字(word)
D. 千字节(kilobyte)
答案 B
14. 一个班级有10个男生和12个女生。如果要选出一个3人的小组,并且小组中必须至少包含1个女生,那么有多少种可能的组合?( )
A. 1420
B. 1770
C. 1540
D. 2200
答案 A
15. 以下哪个不是操作系统?( )
A. Linux
B. Windows
C. Android
D. HTML
答案 D

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

(1)

#include<iostream>
#include<cmath>
using namespace std;
double f(double a,double b,double c){
    double s=(a+b+c)/2;
    return sqrt(s*(s-a)*(s-b)*(s-c));
}
int main(){
   cout.flags(ios::fixed);
   cout.precision(4);
   
   int a,b,c;
   cin>>a>>b>>c;
   cout<<f(a,b,c)<<endl;
   return 0;
}

假设输入的所有数都为不超过1000的正整数,完成下面的判断题和单选题:
判断题
16. (2分)当输入为“2 2 2”时,输出为“1.7321”( )
答案 正确
17. (2分)将第7行中的"(s-b)(s-c)“改为”(s-c)(s-b)"不会影响程序运行的结果( )
答案 正确
18. (2分)程序总是输出四位小数( )
答案 正确
单选题
19. 当输入为“3 4 5”时,输出为( )
A. “6.0000” B. “12.0000” C. “24.0000” D. “30.0000”
答案 A
20. 当输入为“5 12 13”时,输出为( )
A. “24.0000” B. “30.0000” C. “60.0000” D. “120.0000”
答案 B

(2)

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int f(string x,string y){
    int m=x.size();
    int n=y.size();
    vector<vector<int>>v(m+1,vector<int>(n+1,0));
   for(int i=1;i<=m;i++){
       for(int j=1;j<=n;j++){
            if(x[i-1]==y[j-1]){
                v[i][j]=v[i-1][j-1]+1;
            }else{
                v[i][j]=max(v[i-1][j],v[i][j-1]);
            }
        }
    }
    return v[m][n];
}
bool g(string x,string y){
    if(x.size() != y.size()){
        return false;
    }
    return f(x+x,y)==y.size();
}
int main(){
    string x,y;
    cin>>x>>y;
    cout<<g(x,y)<<endl;
    return 0;
}

判断题
21. f函数的返回值小于等于min(n,m)。( )
答案 正确
22. f函数的返回值等于两个输入字符串的最长公共子串的长度。( )
答案 错误
23. 当输入两个完全相同的字符串时,g函数的返回值总是true( )
答案 正确
单选题
24. 将第19行中的“v[m][n]”替换为“v[n][m]”,那么该程序( )
A. 行为不变 B. 只会改变输出 C…一定非正常退出 D. 可能非正常退出
答案 D
25. 当输入为 “csp-j p-jcs” 时,输出为( )
A. “0” 8. “1” C “T” D. “F”
答案 B
26 当输入为“csppsc spsccp”时,输出为:( )
A. “T” B. “F” c. “0” 0. “1”
答案 D

(3)

#include <iostream>
#include <cmath>
using namespace std;
int solve1(int n){
    return n*n;
}
int solve2(int n){
   int sum=0;
   for(int i=1;i<=sqrt(n);i++){
        if(n%i==0){
            if(n/i==i){
                sum+=i*i;
            }else{
                sum+=i*i+(n/i)*(n/i);
            }
        }
    }
    return sum;
}
int main(){
    int n;
    cin>>n;
    cout<<solve2(solve1(n))<<" "<<solve1((solve2(n)))<<endl;
    return 0;
}

假设输入的n是绝对值不超过1000的整数,完成下面的判断题和单选题。
判断题
27. 如果输入的n为正整数,solve2函数的作用是计算n所有的因子的平方和( )
答案 正确
28. 第13~14行的作用是避免n的平方根因子i(或n/i)进入第16行而被计算两次( )
答案 正确
29. 如果输入的n为质数,solve2(n)的返回值为n²+1( )
答案 正确
单选题
30. (4分)如果输入的n为质数p的平方,那么solve2(n)的返回值为( )
A. p²+p+1 B. n²+n+1 C. n²+1 D. p4+2p²+1
答案 B
31. 当输入为正整数时,第一项减去第二项的差值一定( )
A. 大于0 B. 大于等于0且不一定大于0 C. 小于0 D. 小于等于0且不一定小于0
答案 D
32. 当输入为“5”时,输出为( )
A. “651.625” B. “650.729” C. “651.676” D. “652.625”
答案 C

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

(1)(寻找被移除的元素)问题:原有长度为 n+1公差为1等升数列,将数列输到程序的数组时移除了一个元素,导致长度为 n 的开序数组可能不再连续,除非被移除的是第一个或最后之个元素。需要在数组不连续时,找出被移除的元素。试补全程序。

#include <iostream>
#include <vector>
using namespace std;
int find_missing(vector<int>& nums) {
    int left = 0, right = nums.size() - 1;
    while (left < right){
        int mid = left + (right - left) / 2;
        if (nums[mid] == mid +) {;
        } else {;
        }
    }
    return;
}
int main() {
    int n;
    cin >> n;
    vector<int> nums(n);
    for (int i = 0; i < n; i++) cin >> nums[i];
    int missing_number = find_missing(nums);
    if (missing_number ==) {
        cout << "Sequence is consecutive" << endl;
    }else{
        cout << "Missing number is " << missing_number << endl;
    }
    return 0;
}
  1. ①处应填( )
    A. 1 1 1 B. n u m s [ 0 ] nums[0] nums[0] C. r i g h t right right D. l e f t left left
    答案 B
  2. ②处应填( )
    A. l e f t = m i d + 1 left=mid+1 left=mid+1 B. r i g h t = m i d − 1 right=mid-1 right=mid1 C. r i g h t = m i d right=mid right=mid D. l e f t = m i d left=mid left=mid
    答案 A
  3. ③处应填( )
    A. l e f t = m i d + 1 left=mid+1 left=mid+1 B. r i g h t = m i d − 1 right=mid-1 right=mid1 C. r i g h t = m i d right=mid right=mid D. l e f t = m i d left=mid left=mid
    答案 C
  4. ④处应填( )
    A. l e f t + n u m s [ 0 ] left+nums[0] left+nums[0] B. r i g h t + n u m s [ 0 ] right+nums[0] right+nums[0] C. m i d + n u m s [ 0 ] mid+nums[0] mid+nums[0] D. r i g h t + 1 right+1 right+1
    答案 A
  5. ⑤处应填( )
    A. n u m s [ 0 ] + n nums[0]+n nums[0]+n B. n u m s [ 0 ] + n − 1 nums[0]+n-1 nums[0]+n1 C. n u m s [ 0 ] + n + 1 nums[0]+n+1 nums[0]+n+1 D. n u m s [ n − 1 ] nums[n-1] nums[n1]
    答案 D

(2) (编辑距离)给定两个字符串,每次操作可以选择删除(Delete)、插入(Insert)、替换(Replace),一个字符,求将第一个字符串转换为第二个字符串所需要的最少操作次数。

#include <iostream>
#include <string>
#include <vector>
using namespace std;
int min(int x, int y, int z) {
    return min(min(x, y), z);
}
int edit_dist_dp(string str1, string str2) {
    int m = str1.length();
    int n = str2.length();
    vector<vector<int>> dp(m + 1, vector<int>(n + 1));
    for (int i = 0; i <= m; i++) {
        for (int j = 0; j <= n; j++) {
            if (i == 0)
                dp[i][j] =;
            else if (j == 0)
                dp[i][j] =;
            else if ()
                dp[i][j] =;
            else
                dp[i][j] = 1 + min(dp[i][j - 1], dp[i - 1][j],);
        }
    }
    return dp[m][n];
}
int main() {
    string str1, str2;
    cin >> str1 >> str2;
    cout << "Mininum number of operation:" << edit_dist_dp(str1, str2) << endl;
    return 0;
}
  1. ①处应填( )
    A. j j j B. i i i C. m m m D. n n n
    答案 A
  2. ②处应填( )
    A. j j j B. i i i C. m m m D. n n n
    答案 B
  3. ③处应填( )
    A. s t r 1 [ i − 1 ] = = s t r 2 [ j − 1 ] str1[i-1]==str2[j-1] str1[i1]==str2[j1] B. s t r 1 [ i ] = = s t r 2 [ j ] str1[i]==str2[j] str1[i]==str2[j]
    C. s t r 1 [ i − 1 ] ! = s t r 2 [ j − 1 ] str1[i-1]!=str2[j-1] str1[i1]!=str2[j1] D. s t r 1 [ i ] ! = s t r 2 [ j ] str1[i]!=str2[j] str1[i]!=str2[j]
    答案 A
  4. ④处应填( )
    A. d p [ i − 1 ] [ j − 1 ] + 1 dp[i-1][j-1]+1 dp[i1][j1]+1 B. d p [ i − 1 ] [ j − 1 ] dp[i-1][j-1] dp[i1][j1]
    C. d p [ i − 1 ] [ j ] dp[i-1][j] dp[i1][j] D. d p [ i ] [ j − 1 ] dp[i][j-1] dp[i][j1]
    答案 B
  5. ⑤处应填( )
    A. d p [ i ] [ j ] + 1 dp[i][j] + 1 dp[i][j]+1 B. d p [ i − 1 ] [ j − 1 ] + 1 dp[i-1][j-1]+1 dp[i1][j1]+1
    C. d p [ i − 1 ] [ j − 1 ] dp[i-1][j-1] dp[i1][j1] D. d p [ i ] [ j ] dp[i][j] dp[i][j]
    答案 C
更多推荐

设计模式:建造者模式

目录代码简单实现常用使用方法注解方法使用建造者模式总结建造者模式(BuilderPattern)是一种创建型设计模式,它通过将复杂对象的构建过程与其表示分离,使得同样的构建过程可以创建不同的表示。该模式将对象的构建过程封装在一个独立的建造者类中,客户端通过指定不同的建造者来构建不同的对象。在建造者模式中,有以下几个主要

http1和http2的主要区别

主要有四个方面:二进制分帧多路复用服务器主动推送头部压缩将前两点结合来说,首先二进制分帧帧:HTTP/2数据通信的最小单位;消息:HTTP/2中,例如在请求和响应等操作中,消息由一个或多个帧组成;流:存在于连接中的一个虚拟通道。流可以承载双向消息,每个流都有一个唯一的整数ID。而二进制分帧是发生在应用层和传输层中间产生

第P5周—运动鞋识别

一、前期工作1.导入数据集数据集:工作台-Heywhale.comimporttorchimportmatplotlib.pyplotaspltfromtorchvisionimporttransforms,datasetsimportos,PIL,random,pathlibdata_dir=r'D:\P5-data

WebGL 计算平行光、环境光下的漫反射光颜色

目录光照原理光源类型平行光点光源环境光反射类型漫反射漫反射光颜色计算公式环境反射环境反射光颜色表面的反射光颜色(漫反射和环境反射同时存在时)计算公式平行光下的漫反射根据光线和法线方向计算入射角θ(以便求两者点积:cosθ)归一化法线:表面的朝向一个表面具有两个法向量平面的法向量唯一示例代码——平行光漫反射(Lighte

人工智能在现代科技中的应用和未来发展趋势

人工智能是一种模拟人类智能的技术,包括学习、推理、计算和自动化等方面的能力。在现代科技中,人工智能应用非常广泛,包括以下方面:1.自然语言处理:人工智能可以识别和处理自然语言,使得语音识别、语音合成、文本翻译等变得更加智能。2.图像识别:人工智能可以通过图像识别技术来分析和识别图像中的内容,使得人脸识别、车牌识别、图像

2023 蓝帽杯初赛web&部分取证复现

前言:初赛进线下了,计划着在决赛前突击学习一下取证,但时间还是太紧只看了很多内存取证和手机取证计算机取证和服务器取证没掌握---(不过复赛没考,也算狗运了)目录<1>web-LovePHP(file()函数侧信道攻击)<2>取证(1)APK取证1【APK取证】涉案apk的包名是?[答题格式:com.baid.ccs]2

华为云云耀云服务器L实例评测|redis漏洞回顾 & MySQL数据安全解决 搭建主从集群MySQL & 相关设置

前言最近华为云云耀云服务器L实例上新,也搞了一台来玩,期间遇到过MySQL数据库被攻击的情况,数据丢失,还好我有几份备份,没有造成太大的损失;后来有发现Redis数据库被攻击的情况,加入了redis密码初步解决问题。总之就是各种遭受毒打。。。本篇博客回顾Redis的未授权访问漏洞,介绍MySQL主从集群的搭建,以及相关

短视频搭建矩阵源码--短视频矩阵源码搭建

短视频矩阵系统是一种通过将短视频内容进行分类、管理和展示的系统。它可以将用户上传或者选择的短视频按照不同的特定标签进行分类和管理,用户可以根据自己的兴趣和需求选择观看不同类别的短视频。短视频矩阵源码的开发部署其实并不难,主要依托于抖音平台各种开放权限进行研发,市面上常见的源码功能构建也是大同小异,主要处理还在于细节及产

Delphi - Record记录和变体记录

//Integer类型刚好是4个字节,ShortInt类型是1个字节,但是Windows中内存是4字节分配,//所以这里其实还是4个字节,用SizeOf可以看到这个record的大小是8字节,这样虽然浪//费了空间,但是加快了速度(Windows内存分配中的边界对齐原理)TPerson=recordAge:Intege

深入了解接口测试:Postman 接口测试指南

在现代软件开发生命周期中,接口测试是一个至关重要的部分。使用Postman这一工具,可以轻松地进行接口测试。以下是一份简单的使用教程,帮助你快速上手。安装Postman首先,你需要在电脑上安装Postman。你可以从官网上下载并安装它。安装完成后,你可以打开应用并创建一个新的请求。创建请求在Postman应用中,你可以

OSI模型与数据的封装

1、OSI模型上层||七层模型四层模型||应用层|表示层应用层http/ftp/ssh/ftps|会话层-----------------------------------------------------------------------|·传输层传输层tcp/udp----------------------

热文推荐